一、前言

  在程序开发时,有些错误并不是每次运行都会出现。只要输入的数据符合程序的要求,程序就可以正常运行;但如果输入的不符合程序要求,就会抛出异常并停止运行。这时,就需要在开发程序时对可能出现异常的情况进行处理。下面将详细介绍Python中提供的异常处理语句。


二、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”,则表示为当前的异常指定一个别名,通过该别名,可以记录异常的具体内容。

说明 :在使用try…except语句捕获异常时,如果except后面不指定异常名称,则表示捕获全部异常。

  • block2:表示进行异常处理的代码块。在这里可以输出固定的提示信息,也可以通过别名输出异常的具体内容。

说明 :使用try…except语句捕获异常后,当程序出错时,输出错误信息后,程序会继续执行。

  例如,在执行除法运算时,对可能出现的异常进行处理,代码如下:

def division():
    num1 = int(input("请输入被除数:"))  # 用户输入提示,并记录
    num2 = int(input("请输入除数:"))
    result = num1 // num2  # 执行除法运算
    print(result)


if __name__ == "__main__":
    try:  # 捕获异常
        division()  # 调用函数
    except ZeroDivisionError:  # 处理异常
        print("输入错误:除数不能为0")  # 输出错误原因

三、try…except…else 语句

  在Python中,还有另外一种异常处理结构,它是try…except…else 语句,也就是在原来try…except语句的基础上再添加一个else句子,用于指定当try语句模块中没有出现异常时要执行的语句块。该语句块中的内容在try语句中发现异常时,将不被执行。例如,在执行除法运算时,实现当division()函数执行时没有抛出异常时,输出文字“程序执行完毕……”,代码如下:

def division():
    num1 = int(input("请输入被除数:"))  # 用户输入提示,并记录
    num2 = int(input("请输入除数:"))
    result = num1 // num2  # 执行除法运算
    print(result)


if __name__ == "__main__":
    try:  # 捕获异常
        division()  # 调用函数
    except ZeroDivisionError:  # 处理异常
        print("\n错误了:除数不能为0")  # 输出错误原因
    except ValueError as e:  # 处理ValueError异常
        print("输入错误", e)  # 输出错误原因
    else:
        print("程序执行完成……")  # 没有异常时执行

  执行上面代码,将显示如下图所示:

在这里插入图片描述


四、try…except…finally 语句

  完整的异常处理语句应包含finally代码模块,通常情况下,无论程序中有无异常产生,finally代码块中的代码都会被执行。基本格式如下:

try:
	block1
except [ExceptionName [as alias]]:
	block2
finally:
	block3

  对于try…except…finally 语句的理解并不复杂,它只是比try…except语句多了一个finally代码快,如果程序中有一些在任何情况中都必须执行的代码,那么就可以将它们放在finally语句的区块中。

说明 :使用except句子是为了允许处理异常。无论是否引发了异常,使用finally子句都可以执行。如果分配了有限的资源(如打开文件),则应该将释放资源的代码放置在finally语句的区块中。

  例如,在执行除法运算时,实现当division()函数在执行时无论是否抛出异常,都输出文字“释放资源,并关闭”。修改后的代码如下:

def division():
    num1 = int(input("请输入被除数:"))  # 用户输入提示,并记录
    num2 = int(input("请输入除数:"))
    result = num1 // num2  # 执行除法运算
    print(result)


if __name__ == "__main__":
    try:  # 捕获异常
        division()  # 调用函数
    except ZeroDivisionError:  # 处理异常
        print("\n错误了:除数不能为0")  # 输出错误原因
    except ValueError as e:  # 处理ValueError异常
        print("输入错误", e)  # 输出错误原因
    else:
        print("程序执行完成……")  # 没有异常时执行
    finally:  # 无论是否抛出异常都执行
        print("释放资源,并关闭")

  执行代码,将显示如下图所示:

在这里插入图片描述
  至此,已经介绍了异常处理语句的try…except、try…except…else 、try…except…finally等形式。下面通过下图说明异常处理的各个句子的执行关系。

在这里插入图片描述


五、使用raise 语句抛出异常

  如果某个函数或方法可能会产生异常,但不想在当前函数或方法中处理这个异常,则可以使用raise 语句在函数或方法中抛出异常。raise语句的基本格式如下:

raise [ExceptionName[(reason)]]

  其中,ExceptionName[(reason)]为可选参数,用于指定抛出的异常名称,以及异常信息的相关描述。如果省略,就会把当前信息的错误原样抛出。

说明 :ExceptionName[(reason)]参数中的(reason)也可以省略,如果省略,则在抛出异常时,不附带任何描述信息。

  例如,在执行除法运算时,在division()函数中实现,当除数为0时,应用raise语句抛出一个ValueError异常,接下来在最后一行语句的下方添加except语句处理ValueError异常,代码如下:

def division():
    num1 = int(input("请输入被除数:"))  # 用户输入提示,并记录
    num2 = int(input("请输入除数:"))
    if num2 == 0:
        raise ValueError("除数不能为0")
    result = num1 // num2  # 执行除法运算
    print(result)


if __name__ == "__main__":
    try:  # 捕获异常
        division()  # 调用函数
    except ZeroDivisionError:  # 处理异常
        print("\n错误了:除数不能为0")  # 输出错误原因
    except ValueError as e:  # 处理ValueError异常
        print("输入错误", e)  # 输出错误原因
    else:
        print("程序执行完成……")  # 没有异常时执行
    finally:  # 无论是否抛出异常都执行
        print("释放资源,并关闭")


Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐