python异常处理

本文详细介绍了Python中的异常处理,包括try/except语句用于捕捉异常,try/except…else用于在无异常时执行额外操作,try-finally确保代码块无论是否异常都会执行,以及如何自定义异常和使用finally定义清理行为。同时,还提到了预定义的清理行为,如文件操作后的自动关闭,并提供了Python学习路线和资源推荐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

异常处理

try/except

异常捕捉可以使用 try/except 语句。

在这里插入图片描述以下例子中,让用户输入一个合法的整数,但是允许用户中断这个程序(使用 Control-C 或者操作系统提供的方法)。用户中断的信息会引发一个 KeyboardInterrupt 异常。
在这里插入图片描述
try 语句按照如下方式工作;

首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
如果没有异常发生,忽略 except 子句,try 子句执行后结束。
如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。

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

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

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

在这里插入图片描述最后一个except子句可以忽略异常的名称,它将被当作通配符使用。你可以使用这种方法打印一个错误信息,然后再次把异常抛出。
在这里插入图片描述

try/except…else

try/except语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。

else 子句将在 try 子句没有发生任何异常的时候执行。
在这里插入图片描述以下实例在 try 语句中判断文件是否可以打开,如果打开文件时正常的没有发生异常则执行 else 部分的语句,读取文件内容:
在这里插入图片描述使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。
异常处理并不仅仅处理那些直接发生在 try 子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常。例如:
*在这里插入图片描述

try-finally 语句

try-finally 语句无论是否发生异常都将执行最后的代码。
在这里插入图片描述以下实例中 finally 语句无论异常是否发生都会执行:
在这里插入图片描述

抛出异常

Python 使用 raise 语句抛出一个指定的异常。

raise语法格式如下:

raise [Exception [, args [, traceback]]]

在这里插入图片描述以下实例如果 x 大于 5 就触发异常:
在这里插入图片描述执行以上代码会触发异常:

Traceback (most recent call last):
   File "test.py", line 3, in <module>
     raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
 Exception: x 不能大于 5。x 的值为: 10

raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。

如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。

在这里插入图片描述

用户自定义异常

你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:

 >>> class MyError(Exception):
         def __init__(self, value):
             self.value = value
         def __str__(self):
             return repr(self.value)
    
 >>> try:
         raise MyError(2*2)
     except MyError as e:
         print('My exception occurred, value:', e.value)
    
 My exception occurred, value: 4
 >>> raise MyError('oops!')
 Traceback (most recent call last):
   File "<stdin>", line 1, in ?
 __main__.MyError: 'oops!'

在这个例子中,类 Exception 默认的 init() 被覆盖。

当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类:

 class Error(Exception):
     """Base class for exceptions 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 error
     """
 ​
     def __init__(self, expression, message):
         self.expression = expression
         self.message = message
 ​
 class TransitionError(Error):
     """Raised when an operation attempts a state transition that's not
     allowed.
 ​
     Attributes:
         previous -- state at beginning of transition
         next -- attempted new state
         message -- explanation of why the specific transition is not allowed
     """
 ​
     def __init__(self, previous, next, message):
         self.previous = previous
         self.next = next
         self.message = message

大多数的异常的名字都以"Error"结尾,就跟标准的异常命名一样。

定义清理行为

try 语句还有另外一个可选的子句,它定义了无论在任何情况下都会执行的清理行为。 例如:

 >>> try:
 ...     raise KeyboardInterrupt
 ... finally:
 ...     print('Goodbye, world!')
 ...
 Goodbye, world!
 Traceback (most recent call last):
   File "<stdin>", line 2, in <module>
 KeyboardInterrupt

以上例子不管 try 子句里面有没有发生异常,finally 子句都会执行。
如果一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后被抛出。
下面是一个更加复杂的例子(在同一个 try 语句里包含 except 和 finally 子句):

 >>> def divide(x, y):
         try:
             result = x / y
         except ZeroDivisionError:
             print("division by zero!")
         else:
             print("result is", result)
         finally:
             print("executing finally clause")
    
 >>> divide(2, 1)
 result is 2.0
 executing finally clause
 >>> divide(2, 0)
 division by zero!
 executing finally clause
 >>> divide("2", "1")
 executing finally clause
 Traceback (most recent call last):
   File "<stdin>", line 1, in ?
   File "<stdin>", line 3, in divide
 TypeError: unsupported operand type(s) for /: 'str' and 'str'

预定义的清理行为

一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。

这面这个例子展示了尝试打开一个文件,然后把内容打印到屏幕上:

 for line in open("myfile.txt"):
     print(line, end="")

以上这段代码执行完毕后,就算在处理过程中出问题了,文件 f 总是会关闭。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(文末获取!)
在这里插入图片描述
温馨提示:篇幅有限,已打包文件夹,获取方式在“文末”!!!

二、Python必备开发工具

在这里插入图片描述

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

六、Python练习题

检查学习结果。
在这里插入图片描述

七、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值