python中五种异常机制的简介

本文介绍了Python中的异常处理机制,包括try...except语句用于捕获并处理特定异常,try...finally确保代码无论是否发生异常都能执行,assert断言用于调试阶段验证条件是否为真,以及with...as语句简化资源管理。

默认的异常处理器

 

代码如下:


s = 'Hello girl!'
print s[100]
print 'continue'

 

如果我们没有对异常进行任何预防,那么在程序执行的过程中发生异常,就会中断程序,调用python默认的异常处理器,并在终端输出异常信息。这种情况下,第3行代码不会执行。

try…except

 

代码如下:


s = 'Hello girl!'
try:
 print s[100]
except IndexError:
 print 'error...'
print 'continue'

 

程序执行到第2句时发现try语句,进入try语句块执行,发生异常,回到try语句层,寻找后面是否有except语句。找到except语句后,会调用这个自定义的异常处理器。except将异常处理完毕后,程序继续往下执行。这种情况下,最后两个print语句都会执行。

except后面也可以为空,表示捕获任何类型的异常。

try…finally

 

代码如下:


s = 'Hello girl!'
try:
 print s[100]
finally:
 print 'error...'
print 'continue'

 

finally语句表示,无论异常发生与否,finally中的语句都要执行。但是,由于没有except处理器,finally执行完毕后程序便中断。这种情况下,倒第2个print会执行,到第1个不会执行。如果try语句中没有异常,三个print都会执行。

assert

 

代码如下:


assert False,'error...'
print 'continue'

 

这个语句,先判断assert后面紧跟的语句是True还是False,如果是True则继续执行print,如果是False则中断程序,调用默认的异常处理器,同时输出assert语句逗号后面的提示信息。本例情况下,程序中断,提示error,后面的print不执行。

with…as

 

代码如下:


with open('nothing.txt','r') as f:
 f.read()
 print 2/0
print 'continue'

 

我们平时在使用类似文件的流对象时,使用完毕后要调用close方法关闭,很麻烦。这里with…as语句提供了一个非常方便的替代方法:open打开文件后将返回的文件流对象赋值给f,然后在with语句块中使用。with语句块完毕之后,会隐藏地自动关闭文件。

如果with语句或语句块中发生异常,会调用默认的异常处理器处理,但文件还是会正常关闭。

这种情况下,会抛出异常,最后的print不执行

### Java 和 Python异常处理机制对比 #### Java 异常处理机制 在 Java 中,异常处理通过 `try`、`catch`、`finally` 和 `throw` 关键字实现。Java 要求开发者显式声明可能抛出的受检异常 (checked exceptions),这使得代码更加严谨但也增加了复杂度。 当发生错误时,程序会创建一个异常对象并将其传递给运行时系统。如果当前方法无法处理该异常,则继续向调用栈上传播直到找到合适的处理器[^1]。 ```java public class ExceptionExample { public static void main(String[] args) { try { int result = divide(10, 0); System.out.println("Result is " + result); } catch (ArithmeticException e) { System.err.println("Cannot divide by zero!"); } finally { System.out.println("This will always execute."); } } private static int divide(int a, int b) throws ArithmeticException { if (b == 0) throw new ArithmeticException(); return a / b; } } ``` #### Python 异常处理机制 Python 使用类似的结构来捕获和处理异常,即 `try`...`except` 块。然而,在 Python 中并没有强制性的检查异常的概念;所有的异常都是未检查的(unchecked)。这意味着程序员可以选择忽略某些类型的异常而不会导致编译失败。 此外,Python 支持更灵活的语法用于指定多个异常类型以及嵌套异常处理逻辑。还可以利用上下文管理器(`with`语句)简化资源释放操作[^2]。 ```python def safe_division(a, b): try: result = a / b except ZeroDivisionError as err: print(f'Handling runtime error: {err}') return None else: print('No errors occurred.') return result finally: print('Executing cleanup code.') print(safe_division(10, 2)) print(safe_division(10, 0)) ``` #### 主要区别总结 - **异常分类**: Java 将异常分为两类——受检异常(Checked Exceptions)和非受检异常(Unchecked Exceptions),而 Python 不做这种区分。 - **语法差异**: 两者都支持基本形式的 `try-catch/except` 结构,但在细节上有所不同。例如,Python 提供了更为简洁的方式定义多层异常捕捉,并且有专门针对特定场景设计的功能如上下文管理器。 - **设计理念的不同**: Java 更加严格地要求开发人员提前预见可能出现的问题并通过接口签名体现出来;相比之下,Python 则倾向于让开发者自由决定何时何地处理潜在的风险点.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WangLanguager

您的鼓励是对我最大的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值