Dans Python
, l'objet d'exception (objet d'exception)
est utilisé pour représenter des situations anormales qui se produisent lors de l'exécution du code lorsqu'une erreur se produit dans le programme en cours d'exécution. une exception sera levée. Python
中,使用异常对象(exception object)
来表示代码执行过程中所发生的异常情况,当执行程序爆出错误的时候则会抛出异常。
如果没有正确处理异常,则会终止运行。
你可以想象一下,如果你在开发一款产品时,出现异常而不报告出发生异常的原因,是不是会很难受,也很难解决异常的问题。
为了提高产品的稳定性与灵活性,Python
运行开发者捕捉并处理各类异常,一般的内部模块报错如KeyError异常类
较为常见,当然也有很多其他的。
简单了解下,Python将代码执行错误分为两类:语法错误(syntax error)
和异常(exception)
。
首先,是语法错误的问题。字面可知,代码解析错误。
这种错误通常出现在初学者,主要原因是所执行的代码不符合Python语法的规范,故会报出语法错误导致code停机。
下面给出一个错误示范:
>>> if for not in list(1,2,3,4) File "<stdin>", line 1 if for not in list(1,2,3,4) ^ SyntaxError: invalid syntax
从上面的报错中可以知道是语法错误,无效的语法。并且指出了错误的地方在for
的位置,很显然if
和for
不能用在一起。
异常则是在代码执行过程中发现的错误,这是很难提前被发现的,即使代码写的很规范标准,但也可能会出现执行异常的情况。
下面给出一个错误示例。在数学运算中,经常讨论的问题是除数为零的情况。然而,0作为除数是不被允许的,因为这样会导致异常情况。
>>> a = 5 / 0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero
很明显报错指出0作为除数是不对的。
当我们了解了错误和异常后,就得处理异常情况。对于语法错误这种问题多多练习即可避免,对于第二种异常,python
给出了try-except
语句来处理。
为了更清晰的解释,还是以上面的除数为0的情况作为例子,我们通过添加try-except
语句捕捉并处理异常情况:
def division(x, y): try: return x / y except ZeroDivisionError: print("0不能作为除数!!!")
然后我们再在terminal调用函数试试:
division(x=1, y=0)
输出:
0不能作为除数!!!
虽然我们的输入是错误的理论应该报错,但是并没有报错而且还返回了一段话。
下面解释一下try-except
语句的工作原理:
Try-except中的代码会被正常执行
如果没有出现异常则跳过except代码块并结束try-except
如果try-except中的某一句代码出现了问题异常,剩余代码停止执行,如果出现的异常与except所指定的一致,则执行except中的代码块,异常处理结束整个应用程序继续执行
如果出现的异常与except中指定的不符合,那么则跳出try语句,程序继续抛出异常并终止执行代码
当然,我们所编写的代码可能会出现多种异常情况,因此我们可以将所有的异常情况写在一个except语句块中,具体实现如下:
except (RuntimeError, TypeError, NameError):pass
如果捕捉到异常列表中的任意一项异常表达式,则都会进入except
Erreurs et exceptionsUne brève introduction, Python divise les erreurs d'exécution de code en deux catégories : l'erreur de syntaxeAfin d'améliorer la stabilité et la flexibilité du produit,
Python
exécute les développeurs pour capturer et gérer diverses exceptions. Les erreurs générales du module interne telles que laClasse d'exception KeyError
sont plus courantes. . Bien sûr, il y en a bien d’autres aussi.
(erreur de syntaxe)
et l'exception (exception)
.
D'après le rapport d'erreur ci-dessus, nous pouvons savoir qu'il s'agit d'une erreur de syntaxe et d'une syntaxe invalide. Et a souligné que l'erreur est dans la position deCe type d'erreur se produit généralement chez les débutants. La raison principale est que le code en cours d'exécution n'est pas conforme aux spécifications de syntaxe Python, donc une erreur de syntaxe sera signalée et le code s'arrêtera.
Un exemple d'erreur est donné ci-dessous :def passpass(x=1): try: return print(x+x) except (RuntimeError, TypeError, NameError): pass except TypeError: print('参数错误啦~') except NameError: print('名称错误啦~')Copier après la connexion
for
. Évidemment, if
et for
ne peuvent pas être utilisés ensemble.
Après avoir compris les erreurs et les exceptions, nous devons gérer les exceptions. Des problèmes tels que les erreurs de syntaxe peuvent être évités en pratiquant davantage. Pour la deuxième exception,class A(Exception): pass class B(A): pass class C(B): pass for cls in [A, B, C]: try: raise cls() except C: print('C') except B: print('B') except A: print('A')Copier après la connexionÉvidemment, le message d'erreur indique que 0 est incorrect comme diviseur.
Gestion des exceptions
python
fournit une instruction try-sauf
pour la gérer. Pour une explication plus claire, prenons comme exemple le cas ci-dessus où le diviseur est 0. Nous capturons et gérons les exceptions en ajoutant une instruction try-sauf
:
class A(Exception): pass class B(A): pass class C(B): pass for cls in [A, B, C]: try: raise cls() except A: print('A') except B: print('B') except C: print('C')
def passpass(x=1): try: return print(x/x) except TypeError: print('参数错误啦~') except NameError: print('名称错误啦~') except: print('报错啦~自己查')
try-sauf
:
try: pass except: pass else: pass
sauf
traitement. 🎜🎜Bien sûr, si vous souhaitez gérer chaque exception individuellement, vous pouvez également la gérer une par une : 🎜def passpass(x=1): try: return print(x/x) except TypeError as error: print('参数错误啦~', error) except NameError: print('名称错误啦~') except: print('报错啦~自己查')
>>> raise NameError('HiThere') Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: HiThere
class Error(Exception): """Base class for exception in this module.""" pass class InputError(Error): """Exception raised for errors in the input. Attributes: expression -- input expression in which the error occurred message -- explanation of the winerror """ def __init__(self, expression, message): self.expression = expression self.message = message
def passpass(x=1): try: return print(x/x) except TypeError as error: print('参数错误啦~', error) except NameError: print('名称错误啦~') except: print('报错啦~自己查') finally: print('运算结束~')
自定义异常类必须要直接或间接继承自Exception类。尽管自定义异常类与其他类具有相同的功能,但为保持简洁,应该仅提高必要的属性。
class Error(Exception): """Base class for exception in this module.""" pass class InputError(Error): """Exception raised for errors in the input. Attributes: expression -- input expression in which the error occurred message -- explanation of the winerror """ def __init__(self, expression, message): self.expression = expression self.message = message
else在代码正常执行后才会被执行的代码块,但有些情况无论代码块是否出现异常都要执行,则需要用到finally语句:
def passpass(x=1): try: return print(x/x) except TypeError as error: print('参数错误啦~', error) except NameError: print('名称错误啦~') except: print('报错啦~自己查') finally: print('运算结束~')
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!