python 异常捕捉

python中捕捉异常常用句式try...except.

 

try 语句按照如下方式工作;

  • 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。

  • 如果没有异常发生,忽略 except 子句,try 子句执行后结束。

  • 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。

  • 如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。

一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。

处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。

一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:

except (RuntimeError, TypeError, NameError):    pass

接下来我们来写一个具体的demo来看一下:

try:    
  print(a)
except NameError as e:
print(e) 
>>>name 'a' is not defined

以上程序可看到try中执行一个未定义的变量,运行报错,报错信息则被下面except给接住了,并输出了具体的错误信息,错误的类型则为NameError 。

若我们将错误类型修改一下,情况如下示例:

try:
print(a)
except IOError as e:
print(e)

会发现执行以上程序仍就报错了,这是因为错误类型本该是NameError ,我们却用IOError 进行接收,发现报错与except中不匹配,则仍旧执行了try中的程序。如果我们在执行时不清楚具体的错误类型,可以用异常的基类,

BaseException或者我们常用的错误类型集合Exception。

try:
fh = open("testfiles", "r")
print(fh.readlines())
except BaseException as e:
print(e)  
>>>[Errno 2] No such file or directory: 'testfiles'

try...except...else...

else后面是如果程序执行没有异常的话,则需要在执行一次else里面的内容,若存在异常,则不会执行else里面的内容。

try:
print('执行程序')
except Exception as e:
print('异常信息是:'+str(e))
else:
print('没有异常')

>>>执行程序>>>没有异常 

try...finally...

finally后面是无论以上程序有没有异常报错,都会执行finally里面的内容,起到一个兜底的作用。

try:
print(abc)
except Exception as e:
print('异常信息是:'+str(e))
else:
print('没有异常')
finally:
print('以上程序执行完毕')

>>>异常信息是:name 'abc' is not defined

>>>以上程序执行完毕  

raise Exception

抛出异常,rasise是我们手动去抛出的一些异常,可能有些业务规则不满足我们的需求,程序又没有语法实质性的错误,所以我们可以自定义抛出错误。

a = 10
if a>5:
raise Exception('a不能超过5')

>>> Traceback (most recent call last):>>> File "E:/Python/selenium/Learn/pythonFirst/firstApi.py", line 45, in <module>>>> raise Exception('a不能超过5')>>>Exception: a不能超过5

还有一些时候我们捕捉到了异常,并不想对其进行处理,想再次把它抛出去,我们还可以这样写:

try:
print(a)
except NameError:
print('代码执行中.......')
raise
>>>代码执行中.......>>>Traceback (most recent call last):>>> File "E:/Python/selenium/Learn/pythonFirst/firstApi.py", line 38, in <module>>>> print(a)>>>NameError: name 'a' is not defined

以上可看到程序捕捉到了NameError,然后再次将其抛了出去。

原文地址:https://www.cnblogs.com/lexus168/p/13630484.html