💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 1 Python 异常处理参考 本节简单罗列 Python 语言中与异常处理有关的常用语句形式及用法。 发生错误时通常由系统自动抛出异常,但也可由程序自己抛出并捕获。 捕获并处理异常:try-except 发生错误时,如果应用程序没有预定义的处理代码,则由 Python 的缺省异常处理机制 来处理,处理动作是中止应用程序并显示错误信息。如果程序自己处理异常,可编写 try-except 语句来定义异常处理代码。详见前面各节。 手动抛出异常:raise 异常可以由系统自动抛出,也可以由我们自己的程序手动抛出。Python 提供 raise 语句 用于手动抛出异常。下面的语句抛出一个 ValueError 异常,该异常被 Python 的缺省异常处 理程序捕获: ``` >>> raise ValueError Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError ``` 除了错误类型,raise 语句还可以带有错误的描述信息: ``` >>> raise ValueError, "Wrong value!" Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: Wrong value! ``` 当然也可以由程序自己处理自己抛出的异常,例如 ``` >>> try: raise ValueError except ValueError: print "Exception caught!" Exception caught! ``` 用户自定义异常 前面程序例子中抛出的都是 Python 的内建异常,我们也可以定义自己的异常类型。为 此目的,需要了解 Python 的异常类 Exception 以及类、子类、继承等面向对象程序设计概念, 这些概念将在第 x 章中介绍。这里我们用下面的简单例子演示大致用法,以使读者先获得一 个初步印象: ``` >>> class MyException(Exception): pass ``` 这是一个类定义,它在 Python 内建的 Exception 类的基础上定义了我们自己的异常类 MyException。虽然语句 pass 表明我们并没有在 Exception 类的基础上添加任何东西,但 MyException 确实是一个新的异常类,完全可以像 Python 内建的各种异常一样进行抛出、捕 获。例如: ``` >>> try: raise MyException except MyException: print "MyException caught!" MyException caught! ``` 确保执行的代码:try-finally 一般来说,发生异常之后,控制都转到异常处理代码,而正常算法部分的代码不再执行。 Python 的异常处理还允许我们用 try-finally 语句来指定这样的代码:不管是否发生异常,这 些代码都必须执行。这种机制可以用来完成出错后的扫尾工作。例如: ``` >>> try: x = input("Enter a number: ") print x finally: print "This is final!" Enter a number: 123 123 This is final! ``` 本例中,我们为 x 输入了一个正常数值 123,故 try 语句块没有发生异常,显示 123 后 又执行了最后的 print 语句。为什么不写成如下形式呢? ``` x = input("Enter a number: ") print x print "This is final!" ``` 区别在于,当发生错误时,这种写法就有可能未执行最后的 print 语句,而 try-finally 的写法则在发生异常的情况下也会确保执行最后的 print 语句。例如我们再次执行上面的语 句: ``` >>> try: x = input("Enter a number: ") print x finally: print "This is final!" Enter a number: abc This is final! Traceback (most recent call last): File "<stdin>", line 2, in <module> File "<string>", line 1, in <module> NameError: name 'abc' is not defined ``` 可见,由于输入数据错误,导致 try 语句块发生异常而无法继续,但 finally 下面的 语句却得到了执行。仅当 finally 部分确保执行之后,控制才转到(缺省)异常处理程序 来处理捕获到的异常。 一般形式:try-except-finally 这种形式的异常处理语句综合了 try-except 和 try-finally 的功能。首先执行 try 部分,如 果一切正常,再执行 finally 部分。try 部分如果出错,则还是要执行 finally 部分,然后再由 except 部分来处理异常。