异常处理 & 语法错误
语法错误:简而言之,就是你的代码写错了
异常: 即使是你的代码在语法上没有任何错误,也可能引发错误,我们称为异常
万能的 try except 语句:
在try程序段中,我们放入容易犯错的部分。后面可以跟上except
执行方式:
-
如果没有异常发生, except 子句 在 try 语句执行完毕后就被忽略了。
-
如果在 try 子句执行过程中发生了异常,那么该子句其余的部分就会被忽略。
如果异常匹配于 except 关键字后面指定的异常类型,就执行对应的except子句。然后继续执行 try 语句之后的代码。
-
如果发生了一个异常,在 except 子句中没有与之匹配的分支,它就会传递到上一级 try 语句中。
如果最终仍找不到对应的处理语句,它就成为一个 未处理异常,终止程序运行,显示提示信息。
我们来写一个:
try:
print(a*2)
except TypeError:
print('TypeError')
当然except 后面可跟多个错误类型
try:
print(a*2)
except (TypeError,RuntimeError,NameError):
print('error')
try except 加上else语句
当 try 语句没有抛出异常时,需要执行一些代码,可以使用这个子句
使用 else 子句比在 try 子句中附加代码要好,因为这样可以避免 try … except 意外的截获本来不属于它们保护的那些代码抛出的异常
我们来比较一下:
例子1(try子句没有问题):
a = 1
try:
print(a*2)
except (TypeError,RuntimeError,NameError):
print('error')
else:
print('ok')
此时将会输出 2 no
例子2(try子句有异常):
try:
print(a*2)
except (TypeError,RuntimeError,NameError):
print('error')
else:
print('ok')
此时将会输出 ok
抛出异常——raise (强制抛出一个指定的异常)
来 先强制抛一个异常再说:
raise NameError('this is a error')
程序将会输出 this is a error这样的错误叫NameError
当你需要明确一个异常是否抛出时,又不想处理它,raise可以让它重新抛出异常
try:
raise NameError('this is a error')
except NameError:
print('this error is going')
raise
程序输出this error is going 但是最后还是会抛出 this is a error
自定义异常(类)
异常类通常应该直接或间接的从 Exception 类派生
先写一个:
class my_error(Exception):
def __init__(self,value):
self.value = value
def __str__(self):
return repr(self.value)
#调用我们的my_error类
try:
raise my_error(2*2)
except my_error as e:
print('error is,value:','e.value')
*********不想写了,这个异常能干什么呢????哈哈哈哈哈**********
最后写个清理行为finally
不管有没有发生异常,finally子句 在程序离开 try 后都一定会被执行
当 try 语句中发生了未被 except 捕获的异常(或者它发生在 except 或 else 子句中)在 finally 子句执行完后它会被重新抛出
try 语句经由 break ,continue 或 return 语句退 出也一样会执行 finally 子句
def func(x, y):
try:
result = x / y
except ZeroDivisionError:
print("division by zero!")
else:
print("result is", result)
finally:
print("executing finally clause")
func(2,1)