于 2020 年 1 月 7 日更新
异常处理使您能够优雅地处理错误并对其进行有意义的处理。 如果未找到所需文件,则向用户显示一条消息。 Python 使用try和except块处理异常。
语法:
try:# write some code# that might throw exceptionexcept <ExceptionType>:# Exception handler, alert the user
如您在try块中看到的那样,您需要编写可能引发异常的代码。 当发生异常时,将跳过try块中的代码。 如果except子句中存在匹配的异常类型,则执行其处理器。
让我们举个例子:
try:f = open('somefile.txt', 'r')print(f.read())f.close()except IOError:print('file not found')
上面的代码如下:
- 执行
try和except块之间的第一条语句。 - 如果没有异常发生,则将跳过
except子句下的代码。 - 如果文件不存在,则会引发异常,并且
try块中的其余代码将被跳过 - 发生异常时,如果异常类型与
except关键字后的异常名称匹配,则将执行该except子句中的代码。
注意:
上面的代码仅能处理IOError异常。 要处理其他类型的异常,您需要添加更多的except子句。
try语句可以具有多个except子句,也可以具有可选的else和/或finally语句。
try:<body>except <ExceptionType1>:<handler1>except <ExceptionTypeN>:<handlerN>except:<handlerExcept>else:<process_else>finally:<process_finally>
except子句类似于elif。 发生异常时,将检查该异常以匹配except子句中的异常类型。 如果找到匹配项,则执行匹配大小写的处理器。 另请注意,在最后的except子句中,ExceptionType被省略。 如果异常不匹配最后一个except子句之前的任何异常类型,则执行最后一个except子句的处理器。
注意:
else子句下的语句仅在没有引发异常时运行。
注意:
无论是否发生异常,finally子句中的语句都将运行。
现在举个例子。
try:num1, num2 = eval(input("Enter two numbers, separated by a comma : "))result = num1 / num2print("Result is", result)except ZeroDivisionError:print("Division by zero is error !!")except SyntaxError:print("Comma is missing. Enter numbers separated by comma like this 1, 2")except:print("Wrong input")else:print("No exceptions")finally:print("This will execute no matter what")
注意:
eval()函数允许 python 程序在其内部运行 python 代码,eval()需要一个字符串参数。
要了解有关eval()的更多信息,请访问 Python 中的eval()。
引发异常
要从您自己的方法引发异常,您需要像这样使用raise关键字
raise ExceptionClass("Your argument")
让我们举个例子
def enterage(age):if age < 0:raise ValueError("Only positive integers are allowed")if age % 2 == 0:print("age is even")else:print("age is odd")try:num = int(input("Enter your age: "))enterage(num)except ValueError:print("Only positive integers are allowed")except:print("something is wrong")
运行程序并输入正整数。
预期输出:
Enter your age: 12age is even
再次运行该程序并输入一个负数。
预期输出:
Enter your age: -12Only integers are allowed
使用异常对象
现在您知道如何处理异常,在本节中,我们将学习如何在异常处理器代码中访问异常对象。 您可以使用以下代码将异常对象分配给变量。
try:# this code is expected to throw exceptionexcept ExceptionType as ex:# code to handle exception
如您所见,您可以将异常对象存储在变量ex中。 现在,您可以在异常处理器代码中使用此对象。
try:number = eval(input("Enter a number: "))print("The number entered is", number)except NameError as ex:print("Exception:", ex)
运行程序并输入一个数字。
预期输出:
Enter a number: 34The number entered is 34
再次运行程序并输入一个字符串。
预期输出:
Enter a number: oneException: name 'one' is not defined
创建自定义异常类
您可以通过扩展BaseException类或BaseException的子类来创建自定义异常类。

如您所见,python 中的大多数异常类都是从BaseException类扩展而来的。 您可以从BaseException类或BaseException的子类(例如RuntimeError)派生自己的异常类。
创建一个名为NegativeAgeException.py的新文件,并编写以下代码。
class NegativeAgeException(RuntimeError):def __init__(self, age):super().__init__()self.age = age
上面的代码创建了一个名为NegativeAgeException的新异常类,该异常类仅由使用super().__init__()调用父类构造器并设置age的构造器组成。
使用自定义异常类
def enterage(age):if age < 0:raise NegativeAgeException("Only positive integers are allowed")if age % 2 == 0:print("age is even")else:print("age is odd")try:num = int(input("Enter your age: "))enterage(num)except NegativeAgeException:print("Only positive integers are allowed")except:print("something is wrong")
在下一篇文章中,我们将学习 Python 模块。
