编写代码时,通常会遇到一些错误:编译错误,运行错误,这两种错误产生的原因有太多种,对程序的影响和查找错误的方法都有很大区别。
编译错误:编写的程序不符合程序的语法规定而导致的语法问题。
运行错误:能够顺利编写,但在运行程序时报错,产生的结果也正确的出入太大。例如:调用的参数的个数不对;缩进符错误等等。
因为语法错误引出的异常一般是因为书写代码没有按照语法规定。
示例:
print 'hello world'
输出:
File "C:\Users\86139\学习\main.py", line 421
print 'hello world'
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('hello world')?
解释:输出提示错误,还会告诉编写人员,错误的具体位置。”^“这个符号所指的地方就是提醒改错的地方。这里是缺少(),会提醒你。
运行时出错证明并不是语法错误,一般是代码可以运行的,但因为其他某种原因特殊情况而发生了报错。
拿之前的代码做示例:
class father:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
class sun(father):
def __init__(self, fname, lname):
super().__init__( fname, lname)
self.xinxi =22
def san(self):
print("姓名",self.firstname,"性别",self.lastname,"年龄", self.xinxi)
x = sun("小王", "憨憨","22")
x.san()
输出:
Traceback (most recent call last):
File "C:\Users\86139\学习\main.py", line 389, in
x = sun("小王", "憨憨","22")
TypeError: __init__() takes 3 positional arguments but 4 were given
解释:在sun类中print(“姓名”,self.firstname,“性别”,self.lastname,“年龄”, self.xinxi)输出四个参数。
但是def init(self, fname, lname)只给了三个。参数数量对不上,语法上没有错误,但是运行的时候会报错。
异常提示为了表达重要性,都是用红色提醒标记,主要信息:
~发生异常程序的文件名和具体位置,如: File "C:\Users\86139\学习\main.py
~发生异常语句在程序中的行号,如:line 426
~发生异常语句,如:print “Hello”
~发生了哪一种异常,如:SyntaxError: Missing parentheses in call to ‘print’.
~提示解决方法,如: Did you mean print(“Hello”)?
try代码块内监视可能出现的异常的程序语块,expect代码块是用户对异常语句处理。
try:
print(i)
except:
print("乌市")
输出:
乌市
理解:可以类比去记,这运行和if结构很像当try出现错误就运行expect代码块。
当有多个except语句是,执行的规则:
~如果异常的类型和except之后的名称相符,对应的except语句就i被执行。
~如果一个异常没有与任何的except相符,那么这个异常将会传递上层的try中。
~多个except语句时,只可能有一个分支会被执行。
~except (exp1 , exp2,…)表示可以同时处理多个异常。
else代码块放置的是当try中没有发生异常时要执行的代码。
try:
print("Hello")
except:
print("小王")
else:
print("最帅")
输出:
Hello
最帅
当try代码块报错:
try:
print "Hello"
except:
print("小王")
else:
print("最帅")
输出:
File "C:\Users\86139\学习\main.py", line 426
print "Hello"
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello")?
finally指定的代码块,不论try块的对错都输出finally。
try:
print(x)
except:
print("Something went wrong")
finally:
print("The 'try except' is finished")
输出:
葡萄
哈密瓜
主动抛出一个异常,这需要关键字raise。
示例:
a = 10
b = 0
if(b==0):
raise ZeroDivisionError
print("good")
输出:
Traceback (most recent call last):
File "C:\Users\86139\学习\main.py", line 440, in
raise ZeroDivisionError
ZeroDivisionError
程序就不会执行最后一条print语句,而是在抛出异常时就推出了。
在抛出异常也可以给出提示。
示例:
a = 10
b = 0
if(b==0):
raise ZeroDivisionError('小王')
print("good")
输出:
Traceback (most recent call last):
File "C:\Users\86139\学习\main.py", line 440, in
raise ZeroDivisionError('小王')
ZeroDivisionError: 小王