作为开发人员,我们对应用程序和特性有很多想法。实现它们是一项乏味的任务。在执行过程中,我们可能会犯错误。这些错误可能与应用程序逻辑或技术有关。这些错误会引起问题 当应用程序运行时。我们把这类问题称为例外。我们不能阻止所有的异常,但我们可以创建一些机制来处理这些情况。在本教程中,我们将研究如何处理这些异常。
什么是例外
我们中的一些人可能熟悉例外情况,但也可能有其他人对例外情况一无所知。异常是应用程序通常停止工作的意外错误情况。有时它不会停止工作,但也不会正常工作。
下面是一个异常如何发生的示例。我们的应用程序从用户和多个给定的数字获得输入。但如果用户输入字符串,则会出现异常。文件名为 myapp.py
.
#!/usr/bin/python3 num1 = input ("Enter number") print(num1*num1)
当我们通过提供一个类似于other的字符来调用下面这样的应用程序时 a
然后一个数字我们会得到一个例外。
$ python3 myapp.py

我们还得到了异常类型。Python为不同的情况提供了不同类型的异常。在此代码中,异常类型为 TypeError
.
异常类型
因为有很多不同的库和函数,所以存在不同类型的异常。这里有一些最受欢迎的。
-
Exception
是所有异常的泛型和基类。 -
StopIteration
迭代器的next()方法未指向任何对象时引发的异常。 -
SystemExit
sys.exit()函数引发的异常。 -
StandardError
是除StopIteration和SystemExit之外的所有内置异常的基类和异常。 -
ArithmeticError
是数学和算术计算以及运算符期间发生的所有错误的基类。 -
OverFlowError
当计算超过给定数值类型的最大限制时引发异常。 -
ZeroDivisionError
数值运算中发生零除或模除时引发的异常。 -
AssertionError
在assert Python编程语言语句失败时引发。 -
AttributeError
属性引用或赋值失败时引发的异常。 -
EOFError
没有输入或到达文件结尾时引发异常。 -
ImportError
导入Python编程语言语句失败时引发的异常。 -
KeyboardInterrupt
当用户使用Linux kill命令或按CTRL+C键盘快捷键中断应用程序的执行时引发的异常。 -
LookupError
为所有查找错误引发异常。 -
IndexError
在数组中找不到索引时引发异常,请按顺序列出。 -
KeyError
在字典中找不到指定键时引发异常。 -
NameError
在本地或全局命名空间中找不到标识符时引发异常。 -
UnboundLocalError
尝试访问函数、方法、模块中的局部变量但尚未为其赋值时引发异常。 -
EnvironmentError
是Python环境之外发生的所有异常的基于类。 -
IOError
输入/输出操作失败时引发的异常,例如写入文件失败或无法打开文件。 -
SyntaxError
出现与Python语法相关的错误时引发的异常。 -
IndentationError
未指定缩进并正确用于捕获代码块时引发的异常。 -
SystemError
Python解释器发现和时引发异常,内部问题。 -
TypeError
尝试获取、设置不同类型的变量或数据类型的操作、函数或方法时引发异常。 -
ValueError
数据类型的内置函数具有有效的参数类型,但参数具有无效值时引发异常。 -
RuntimeError
当引发的异常或错误不适合任何特定类别时引发的异常。 -
NotImplementedError
尝试使用未实现的抽象方法时引发异常。
相关文章: Java中的空指针异常是什么?如何修复?
接住 Try和Except的异常
现在我们要以编程的方式防止这种类型的bug和异常。Python提供了一种机制 try
用于检测给定代码块中的异常。我们将把潜在的错误块放入 try
在下面。我们猜是这条线 print(num1-num1)
可能引发异常。
#!/usr/bin/python3 num1 = input ("Enter number") try: print(num1*num1) except: print("An error occured") print("Operation completed")
当我们通过提供这样的角色来运行时 a
不会引发异常。它只是跳转到代码 except
在引发异常时将运行的块。然后应用程序将在正常情况下流动。

捕捉特定 例外情况
在上一个示例中,我们使用代码触发了一种类型的异常 except
阻止。但是我们可以捕获特定类型的异常并忽略其他异常。我们记得第一个例子中有一个例外 TypeError
. 如果我们只需要捕捉一个异常 TypeError
忽略我们将指定的其他人 TypeError
诸如此类 except
在下面。
#!/usr/bin/python3 num1 = input ("Enter number") try: print(num1*num1) except TypeError: print("An TypeError occurred") print("Operation completed")

否则,如果没有引发异常
我们通常希望在运行关键代码时引发一些异常。但在某些情况下,不会有错误或例外。如果没有错误和异常,我们可以定义一些代码来执行 else
关键字。如果else关键字块中没有错误或异常,我们将放入要运行的代码。在本例中,如果没有错误或异常,我们将打印屏幕“没有异常”。
#!/usr/bin/python3 num1 = input ("Enter number") try: print(num1*num1) except TypeError: print("An TypeError occurred") else: print("There is no exception")print("Operation completed")
捕获多个类型异常
我们可能需要在一个数据库中捕获多个异常 except
代码块。我们将通过使用命令分隔异常类型来提供括号中的异常类型 (TypeA , TypeB , TypeC , ...)
在这个例子中,我们将同时抓住这两个问题 TypeError
和 ZeroDivisionError
.
#!/usr/bin/python3 num1 = input ("Enter number") try: print(num1*num1) except (TypeError,ZeroDivisionError): print("An TypeError occured") print("Operation completed")
使用Finally在异常后运行代码
在签入异常时 try
我们可能需要执行一些代码块,不管发生什么 try
代码块 工作或除外 代码块工作。我们将最终使用 代码块来完成 try-except
阻碍。试过之后除了 最后一个街区, 将运行代码块。这通常用于释放中使用的文件、数据库连接或还原操作等资源 try
代码块。
相关文章: Dpkg错误“Dpkg被中断”及解决方法
在本例中,我们将关闭 finally
代码块以前的代码块是否工作或引发异常。
#!/usr/bin/python3 try: f = open("personels.txt") f.read() finally: f.close()
引发异常
到目前为止,我们已经处理了自筹资金 例外情况。我们还可以在不等待用户输入任何更改的情况下手动引发异常。我们将使用关键字 raise
以手动引发异常。在这个例子中,我们将提高类型 ZerrorDivisionError
例外。
#!/usr/bin/python3 try: print("0/0") raise ZeroDivisionError except (ZeroDivisionError): print("An ZeroDivisionError occurred") print("Operation completed")

用户定义的异常
在编写企业应用程序和库时,我们还需要创建异常类型库。我们可能需要提供操作异常,如文件的无效移动操作。我们可以使用类定义自己的用户定义异常 RuntimeError
就像下面一样。我们将把以下代码放入 CorpExceptions.py
#!/usr/bin/python3 class InvalidMove(RuntimeError): def __init__(self, arg): self.args = arg
我们可以在进口后像以前一样筹集资金 CorpExceptions.py
raise InvalidMode