Python程序开发——第九章 异常处理

简介: Python程序开发——第九章 异常处理

一、异常


python中的异常都是通过类实现的,所有的异常类都是继承自基类BaseException,可分为四类如下:

1667112760726.jpg

若程序中的异常没有被处理,则默认情况下该异常会被传递给上一级,这就是异常的传递,若上一级仍未处理,则会继续向上传递直至异常被处理或程序崩溃。


二、捕获异常


(一)try…except语句


该语句用于捕获程序运行时时的异常,其中try子句后面跟代码,except子句后跟捕获的异常类型以及当捕获到异常后的处理代码。简单的来说,当try子句中若有异常,则忽略该子句中的剩余代码,立即执行except子句中的代码,而当try子句没有异常则不执行

except子句后的内容。
try:
  代码
except(异常类型):
  异常处理代码

python中标准异常有以下:python标准异常

例如下列python代码,这里try子句中由于未声明d变量,使产生NameError:未声明/初始化对象 (没有属性)的异常,except子句中检测到异常从而执行正确的代码:

try:
    a = 1
    b = 2
    c = a * d
    print(c)
except NameError:
    c = a * b
    print(c)

运行结果如下:

1667114589715.jpg


1、单个异常


可以通过在异常类型后跟as e/error 的形式来用于记录具体的异常类型,其中e/error获取异常信息。

例如下列python代码:

try:
    a = 1
    b = 2
    c = a * d
    print(c)
except NameError as e:
    print(f"程序异常,异常原因是:{e}")
    c = a * b
    print(c)

运行结果如下,其中的name ‘d’ is not defined就是所记录的异常信息:

1667114617299.jpg


2、多个异常


可能代码中有多个异常,可通过将异常类一并放在except子句后或使用多个except子句。

例如下列python代码,这里except (TypeError, NameError) as error的含义是当程序中有对类型无效的操作(TypeError)或未声明/初始化对象(NameError)时输出异常信息:

try:
    def function(a, b):
        print(a, b)
    function(2, 3, 4)
except (TypeError, NameError) as error:
    print(f"程序异常,异常原因是:{error}")

运行结果如下:

1667114641936.jpg

也可以分开写多个except子句,即当程序中有不同的异常时执行哪个子句。

例如下列python代码,程序中有对类型无效的操作时通过input()函数接收一个标准输入数据c并输出该数据,而当程序中有未声明/初始化对象的异常时输出记录的异常信息:

try:
    def function(a, b):
        a = b + c
        print(a)
    function(1, 2)
except TypeError as error:
    print(f"程序异常,异常原因是:{error}")
except NameError as error:
    print(f"程序异常,异常原因是:{error}")
    c = input("请输入变量c的值:")
    print(c)

运行结果如下,由于未声明变量c:

1667114662847.jpg

3、省略异常类

省略异常类即省略except子句后的异常类型,表明处理所有捕获到的程序异常。

例如下列python代码:

try:
    a = 1
    b = 2
    c = a + d
    print(c)
except:
    print("捕获到异常!")

运行结果如下:

1667114684805.jpg


(二)try…except…else语句


在try…except语句后加一个else子句,该子句的内容即当try子句没有发生任何异常时执行的代码。

例如下列python代码,当程序有未声明/初始化对象的异常情况时输出提示,若无异常则输出a-b的值:

try:
    a = 1
    b = 2
    c = a + b
    print(c)
except NameError:
    print("未声明/初始化对象!")
else:
    c = a - b
    print(c)

运行结果如下:

1667114709036.jpg


(三)try…except…finally语句


try…except语句与finally子句一起运用时,表示无论是否捕获到异常,finally子句内的代码都要执行,比如在处理文件时就要用到finally子句,即用于关闭文件从而避免占用资源。

例如下列python代码,这里finally子句中不管是否有异常,该子句内的文件关闭file.close()都要执行:

try:
    file = open("file1.txt", mode="r", encoding="utf-8")
    file.write("123456789")
except Exception as error:
    print(f"文件写入失败!原因是:{error}")
finally:
    file.close()
    print("文件已被关闭!")

运行结果如下:

1667114727271.jpg

也可以通过with语句来释放文件,执行语句后with语句会关闭文件,若文件不能打开则也会关闭文件,格式如下:

with 上下文表达式 [as 资源对象]
  语句

这里的上下文表达式返回一个上下文资源器对象,若指定了as子句,则将上下文资源管理器对象的__enter__()方法的返回值赋值给资源对象,另外要注意不是所有对象都可以使用with语句,只有支持上下文管理协议的对象才可以使用该语句。


三、抛出异常


捕获异常可以理解为程序有异常系统报错,另外我们可以通过相关的语句来使异常主动抛出。


(一)raise语句


1、异常类型抛出异常

在raise语句后跟异常类型,即可以通过使用异常类型的名称从而抛出异常。

例如下列python代码,通过使用raise语句抛出OverflowError异常,该异常类型表示数值运算超出最大限制:

raise OverflowError

运行结果如下:

1667114781520.jpg


2、异常对象抛出异常

例如下列python代码,创建了一个OverflowError类的obj_error对象并通过raise语句抛出对象:

obj_error = OverflowError()
raise obj_error

运行结果如下:

1667114798240.jpg


3、由异常抛出异常

通过单用raise关键字可以重新抛出发生的异常。

例如下列python代码:

try:
    print(a)
except NameError as error:
    print(f"文件写入失败!原因是:{error}")
    raise

运行结果如下:

1667114817539.jpg


(二)assert断言语句


assert断言语句用于判断一个表达式是否为真,若为假则抛出AssertionError异常,格式如下,其中表达式是判断的对象,参数通常是一个自定义的描述异常具体信息的字符串:

assert 表达式[,参数]


例如下列python代码,1<-1表达式为假所以程序抛出AssertionError异常:

a = 1
b = -1
assert a < b

运行结果如下:

1667114847989.jpg


四、自定义异常


虽然python中定义了很多的异常类型,但我们也可以自定义异常,即通过创建一个类,让其继承Exception类或其它类。

例如下列python代码,首先自定义异常my_error类,在其类的构造方法中调用基类Exception的__init__方法并将异常信息作为参数

class my_error(Exception):
    def __init__(self, error="格式错误"):
        super().__init__(error)
def f_main():
    file_name = input("请输入文件名称:")
    try:
        if file_name.split(".")[1] in ["txt", "doc"]:
            print("文件名称无异常!")
        else:
            raise my_error()
    except Exception as error:
        print(f"程序异常,异常原因是:{error}")
f_main()


运行结果如下:

1667112638108.jpg

相关文章
|
8天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
25天前
|
程序员 开发者 Python
Python错误与异常处理详解
Python提供强大的错误和异常处理机制,包括语法错误(编译时)和运行时错误。异常处理通过try-except语句实现,优雅地处理运行时错误。例如,尝试除以零会引发`ZeroDivisionError`,可通过except捕获并处理。可以使用多个except处理不同类型的异常,或者用`Exception`捕获所有异常。此外,用raise语句可手动抛出异常,增强代码健壮性。理解并运用这些机制能提升Python编程水平。
|
1月前
|
Python
解释 Python 中的异常处理机制。
解释 Python 中的异常处理机制。
18 0
|
2月前
|
开发者 Python
Python中的异常处理:原理与实践
Python中的异常处理:原理与实践
|
1月前
|
Python
python中文件和异常处理方法(二)
python中文件和异常处理方法(二)
13 0
|
1月前
|
Python
python中文件和异常处理方法(一)
python中文件和异常处理方法(一)
29 0
|
1月前
|
Python
python中文件和异常处理方法(三)
python中文件和异常处理方法(三)
19 0
|
1月前
|
Python
Python异常处理
Python异常处理
12 0
|
1天前
|
UED Python
掌握Python异常处理:面试中的关键考点
【4月更文挑战第14天】本文探讨了Python异常处理在面试中的重要性,涵盖核心概念、常见问题和易错点。异常处理涉及异常、捕获、异常链、自定义异常、finally子句和raise语句。面试中应注意避免过于宽泛的异常捕获、忽视异常链、在finally中误用return、自定义异常设计不实用以及异常处理与业务逻辑混杂等问题。通过理解并解决这些问题,可提升代码健壮性和面试表现。
15 0
|
28天前
|
Linux 数据库连接 C++
【Python 基础教程 23】Python3 错误与异常处理全面指南:从入门到精通的实用教程
【Python 基础教程 23】Python3 错误与异常处理全面指南:从入门到精通的实用教程
107 0

热门文章

最新文章