Python进阶(7):异常处理
Python异常处理机制简介:文章介绍了Python中常见的异常类型及处理方法,包括try-except语句捕获异常、try-except-else语句处理无异常情况、try-finally语句确保资源释放等。通过数学运算示例(如开平方、除法运算)演示了异常捕获过程,并展示了如何使用raise主动抛出异常,以及如何自定义异常信息。文章还提供了异常处理流程图,帮助理解程序执行流程。最后通过反正弦计算
异常Exception
python在程序运行过程中,经常遇到各种各样的错误,这些错误统称为“异常”。比如编译错误invalid syntax【无效的语法】,这将导致程序不能运行,这类异常是显式的。还有一种是隐式的,比如对负数进行开根号 ,尝试对一个数除以0,如下:
import math
print(math.sqrt(-2))
x=10.25
y=0
print(x/y)

出现异常:math domain error
尝试进行某些数学运算时,输入的参数超出了该运算所允许的数值范围。
注意,有些编程语言对负数进行开平方并不抛出异常,返回NaN,例如
在C#中,如下代码返回NaN
double x = Math.Sqrt(-2);
Python常见异常:

在开发程序过程中,需要对可能出现的异常进行处理。使用try...except语法
try...except语句
在 Python 中,提供了 try...except 语句捕获并处理异常。在使用时,把可能产生异常的代码放在 try 语句块中,把处理结果放在 except语句块中,这样,当try语句块中的代码出现错误,就会执行 except 语句块中的代码,如果try语句块中的代码没有错误,那么 except语句块将不会执行。具体的语法格式如下:
try:
block1
except [ExceptionName [as alias]]:
block2
参数说明如下:
block1:表示可能出现错误的代码块。
ExceptionName [as alias]:可选参数,用于指定要捕获的异常。其中,ExceptionName 表示要捕获的异常名称,如果在其右侧加上 as alias,则表示为当前的异常指定一个别名,通过该别名,可以记录异常的具体内容。
如果在except后面不指定异常名称,则捕获全部异常
使用try...except 语句捕获异常后,当程序出错时,输出错误信息后,程序会继续执行。
try...except...else语句
在 Python 中,还有另一种异常处理结构,它是 try...except...else 语句,也就是在原来 try...except语句的基础上再添加一个 else 子句,用于指定当 try语句块中没有发现异常时要执行的语句块。该语句块中的内容当 try 语句中发现异常时,将不被执行。即当try块发生异常时,执行except块,不执行else块
try...except...finally语句
完整的异常处理语句应该包含 finally 代码块,通常情况下,无论程序中有无异常产生,finally 代码块中的代码都会被执行。
使用except 子句是为了允许处理异常。无论是否引发了异常,使用 finally 子句都可以执行清理代码。如果分配了昂贵或有限的资源(如打开文件),则应将释放这些资源的代码放置在 finally 块中
整体异常处理块流程图:

使用 raise 语句抛出异常
如果某个函数或方法可能会产生异常,但不想在当前函数或方法中处理这个异常,则可以使用 raise语句在函数或方法中抛出异常。raise 语句的基本格式如下:
raise [ExceptionName[(reason)]]
其中,ExceptionName[(reason)]为可选参数,用于指定抛出的异常名称,以及异常信息的相关描述如果省略,就会把当前的错误原样抛出。
ExceptionName(reason)参数中的“(reason)”也可以省略,如果省略,则在抛出异常时,不附带任何描述信息。
示例程序:
import math
try:
print(math.sqrt(-2))
except:
print("出错了,不能对负数进行开平方")
x=10.25
y=0
try:
print(x/y)
except (ValueError,ZeroDivisionError) as ex:
print("计算时出现异常:",ex)
print("------当程序出错时,捕获异常、输出错误信息后,程序会继续执行------")
y=2.5
try:
print(x/y)
except (ValueError,ZeroDivisionError) as ex:
print("计算时出现异常:",ex)
else:
print("当try语句块中没有发现异常时执行else语句块")
finally:
print("无论程序中有无异常产生,finally代码块中的代码都会被执行。")
num=float(input("请输入需要反正弦的数字"))
try:
if num>1 or num<-1:
raise ValueError("反正弦的数的范围为【-1,1】,输入非法")
result=math.asin(num)
print("弧度数:",result,",对应角度数:",result*180/math.pi)
except (ValueError,ZeroDivisionError) as ex:
print("计算反正弦时出现异常:",ex)
运行如图:

更多推荐


所有评论(0)