异常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)

运行如图:

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐