第二十讲 python中的异常结构-try except-else-finally

目录

1.try... except 结构

2. try... 多个except结构

3. try...except...else结构

4. try...except...finally结构

5. return语句和异常处理问题

5.1 异常处理前的 return

5.2异常处理后的 return

5.3 finally 块中的 return

6.常见的异常


1.try... except 结构

try except 是最常见的异常处理结构。结构如下:

try:
    # 可能会引发异常的代码块
    result = 10 / 0
except ExceptionType as e:
    # 处理异常的代码块
    print(f"发生了异常: {e}")
  • try:包含可能会引发异常的代码。如果在 try 块中的代码引发了异常,Python 会跳过 try 块中余下的代码,直接执行 except 块。

  • except:用于捕捉和处理异常。你可以指定要捕获的异常类型,也可以捕获所有异常类型。as e 用于获取异常实例,并可以访问异常消息或其他信息。

  • 执行的时候,如果try块中没有引发异常,则跳过except块继续执行后续代码.

  • 执行的时候,如果try块中发生了异常,则跳过try块中的后续代码,跳到相应的except块中处理异常,异常处理完后,继续执行后续代码。

2. try... 多个except结构

try 块配合多个 except 块可以处理不同类型的异常。每个 except 块负责处理特定类型的异常。

try:
    # 可能会引发异常的代码
    result = int("not_a_number")
except ValueError as ve:
    # 处理 ValueError 异常
    print(f"值错误: {ve}")
except ZeroDivisionError as zde:
    # 处理 ZeroDivisionError 异常
    print(f"除零错误: {zde}")
except FileNotFoundError as fnfe:
    # 处理 FileNotFoundError 异常
    print(f"文件未找到: {fnfe}")
except Exception as e:
    # 捕获其他所有异常
    print(f"其他异常: {e}")
  • 具体到通用:将最具体的异常类型放在前面,更通用的异常类型放在后面。这确保特定的异常类型能被准确处理。

  • 顺序重要except 块的顺序是重要的。Python 按顺序检查 except 块,从上到下。如果上面的块能处理异常,下面的块将不会执行。

  • 通用异常Exception 用于捕获所有其他异常,但最好先捕获已知的具体异常。

如下例子:

try:
    value = int(input("请输入一个整数: "))
    result = 10 / value
except ValueError as ve:
    print(f"输入无效: {ve}")
except ZeroDivisionError as zde:
    print(f"不能除以零: {zde}")
except Exception as e:
    print(f"发生了一个错误: {e}")
else:
    print(f"计算结果是: {result}")
finally:
    print("结束处理")

ValueError 处理输入转换错误,ZeroDivisionError 处理除零错误,Exception 捕获所有其他未特定处理的异常。else 块在没有异常时执行,finally 块在 tryexcept 块之后总是执行。

3. try...except...else结构

try...except...else 结构用于更精确地控制异常处理和正常执行的代码块。else 块是在 try 块中的代码没有引发异常时执行的。这个结构可以帮助你在没有异常的情况下执行特定的代码,从而提高代码的清晰度和可维护性。

try:
    # 可能会引发异常的代码
    result = 10 / int(input("请输入一个整数: "))
except ZeroDivisionError as zde:
    # 处理 ZeroDivisionError 异常
    print(f"除零错误: {zde}")
except ValueError as ve:
    # 处理 ValueError 异常
    print(f"输入错误: {ve}")
else:
    # 没有异常时执行的代码
    print(f"计算结果是: {result}")
finally:
    # 无论是否发生异常都会执行的代码(可选)
    print("处理结束")
  • else:在 try 块中的代码没有引发异常时执行。else 块用于执行那些在没有异常的情况下需要运行的代码。它不会被执行到 except 块处理完所有异常之后才会执行。

4. try...except...finally结构

  • try...except...finally 结构用于在处理异常时确保某些代码始终被执行。这种结构的关键在于 finally 块,它会在 try 块和 except 块执行完毕之后总是被执行,无论是否发生异常。它通常用于资源管理和清理工作,确保即使在发生异常的情况下也能完成必要的清理操作。
  • 用来释放try块中申请的资源

try:
    # 尝试打开文件并读取内容
    file = open("example.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError as e:
    # 处理文件未找到的异常
    print(f"文件未找到: {e}")
except IOError as e:
    # 处理其他 I/O 错误
    print(f"文件读取错误: {e}")
finally:
    # 确保文件始终被关闭
    try:
        file.close()
    except NameError:
        # 如果文件打开失败,file 变量可能没有被定义
        pass
    print("文件处理完毕")
  • finally:无论是否发生异常,finally 块中的代码都会被执行。这常用于清理资源(如关闭文件、释放锁或关闭数据库连接),确保这些操作总是被执行。

5. return语句和异常处理问题

  • return 语句用于从函数中返回值并结束函数的执行。异常处理则用于捕获和处理运行时错误,防止程序崩溃。return 语句与异常处理的交互可以影响函数的行为,特别是当异常发生时。
  • 由于return有两种作用:结束方法运行、返回值。我们一般不把return放到异常处理结构中,而是放到方法最后.

5.1 异常处理前的 return

如果函数在执行过程中遇到异常,return 语句在异常被捕获之前不会被执行。

def safe_divide(x, y):
    try:
        return x / y
    except ZeroDivisionError:
        return "Cannot divide by zero."

5.2异常处理后的 return

except 块可以在捕获异常后使用 return 语句返回特定值。finally 块中的代码也可以使用 return,但它会覆盖之前的 return

def func(x):
    try:
        if x < 0:
            raise ValueError("Negative value")
        return x * 2
    except ValueError:
        return "Invalid input"
    finally:
        print("Cleanup code")  # 总会执行

5.3 finally 块中的 return

except 块可以在捕获异常后使用 return 语句返回特定值。finally 块中的代码也可以使用 return,但它会覆盖之前的 return

def example():
    try:
        return 1
    finally:
        return 2  # 覆盖前面的 return
def process_value(x):
    try:
        if x < 0:
            raise ValueError("Negative value not allowed.")
        return x * 10
    except ValueError as e:
        return f"Error: {e}"
    finally:
        print("Finished processing.")

# 使用示例
print(process_value(5))   # 输出: 50
print(process_value(-1))  # 输出: Error: Negative value not allowed.

6.常见的异常

     

异常名

ArithmeticError

所有数值计算错误的基

AssertionError

断言语句失

AttributeError

对象没有这个属

BaseException

所有异常的基

DeprecationWarning

关于被弃用的特征的警

EnvironmentError

操作系统错误的基

EOFError

没有内建输入,到达EOF 

Exception

常规错误的基

FloatingPointError

浮点计算错

FutureWarning

关于构造将来语义会有改变的警

GeneratorExit

生成器(generator)发生异常来通知退

ImportError

导入模块/对象失

IndentationError

缩进错

IndexError

序列中没有此索引(index)

IOError

输入/输出操作失

KeyboardInterrupt

用户中断执行(通常是输入^C)

KeyError

映射中没有这个

LookupError

无效数据查询的基

MemoryError

内存溢出错误(对于Python 解释器不是致命的)

NameError

未声明/初始化对象 (没有属性)

NotImplementedError

尚未实现的方

OSError

操作系统错

OverflowError

数值运算超出最大限

OverflowWarning

旧的关于自动提升为长整型(long)的警

PendingDeprecationWarning

关于特性将会被废弃的警

ReferenceError

弱引用(Weak reference)试图访问已经垃圾回收了的对

RuntimeError

一般的运行时错

RuntimeWarning

可疑的运行时行为(runtime behavior)的警

StandardError

所有的内建标准异常的基

StopIteration

迭代器没有更多的

 

异常名

SyntaxError

Python 语法错

SyntaxWarning

可疑的语法的警

SystemError

一般的解释器系统错

SystemExit

解释器请求退

TabError

Tab 和空格混

TypeError

对类型无效的操

UnboundLocalError

访问未初始化的本地变

UnicodeDecodeError

Unicode 解码时的错

UnicodeEncodeError

Unicode 编码时错

UnicodeError

Unicode 相关的错

UnicodeTranslateError

Unicode 转换时错

UserWarning

用户代码生成的警

ValueError

传入无效的参

Warning

警告的基

WindowsError

系统调用失

ZeroDivisionError

(或取模)(所有数据类型)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

还是那个同伟伟

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值