进阶9: 异常

常见的异常

  1. SyntaxError: 语法错误。当代码不符合 Python 语法规范时,会引发该异常。
if True
    print("Hello")  # 缺少冒号
  1. IndentationError: 缩进错误。Python 对代码缩进严格,错误的缩进会导致此异常。
def func():
print("Hello")  # 缩进错误
  1. NameError: 尝试访问未声明的变量或函数。
print(x)  # x 未定义
  1. TypeError: 操作或函数应用于不适当的类型。
'2' + 2  # 不能将字符串和整数相加
  1. ValueError: 函数接收到的参数类型正确,但值不合适。
int('abc')  # 'abc' 不能被转换为整数
  1. IndexError: 使用无效的索引操作序列。
lst = [1, 2, 3]
print(lst[3])  # 索引超出范围
  1. KeyError: 试图访问字典中不存在的键。
d = {'a': 1}
print(d['b'])  # 'b' 不在字典中
  1. AttributeError: 尝试访问对象不存在的属性。
lst = [1, 2, 3]
lst.push(4)  # 列表对象没有 push 方法
  1. ImportError: 无法引入模块或包。
import non_existent_module  # 模块不存在
  1. ZeroDivisionError: 尝试除以零。
result = 1 / 0  # 除以零
  1. FileNotFoundError: 尝试打开不存在的文件。
with open('non_existent_file.txt', 'r') as f:
    content = f.read()

异常处理

异常处理使用方式

在Python中,try, except, else, 和 finally 关键字用于处理可能会发生的异常情况。每个部分都有特定的用途,以下是它们的使用场景:

try:用于包裹可能引发异常的代码块。如果在try块中的代码执行时发生异常,程序会跳到except块处理异常。

try:
    # 可能引发异常的代码

except:紧随try块之后,用于处理try块中发生的特定异常。可以有一个或多个except块,以处理不同类型的异常。

except SomeException:
   # 处理SomeException的代码

如果你想处理所有类型的异常,可以使用不带具体异常的except

except:
   # 处理所有异常的代码

else:可选部分,用于在try块中没有发生异常时执行的代码。else块只能有一个,并且必须在所有except块之后

else:
   # 当没有异常发生时,执行这段代码

finally:可选部分,无论是否发生异常,finally块中的代码都会执行,通常用于释放资源或执行清理操作,如关闭文件或网络连接。

finally:
   # 不管发生什么情况,都会执行这段代码

示例

try:
    # 试图打开一个文件并读取
    file = open('example.txt', 'r')
    content = file.read()
except FileNotFoundError:
    # 如果文件不存在,输出错误信息
    print("The file was not found.")
except IOError:
    # 如果发生I/O错误,输出错误信息
    print("Error reading the file.")
else:
    # 如果没有异常发生,输出文件内容
    print(content)
finally:
    # 关闭文件,确保释放资源
    if 'file' in locals():
        file.close()

如果无法确定异常类型,可以通过继承Exception类实现。这对于捕获特定应用中的错误非常有用。

进阶9: 异常

异常处理原理

异常传播:当异常在一个代码块中被引发时,Python会立即停止执行该块中后续的代码,并在异常引发的地方寻找“处理程序”。如果找到合适的处理程序,则执行它;否则,异常会向上传播到调用该代码的地方,一直传播到主程序。如果在任何地方都没有捕获该异常,程序会终止并显示错误信息。

这里有一个简单的例子来展示异常的传递:

def function1():
    print("Function 1 started")
    function2()
    print("Function 1 ended")

def function2():
    print("Function 2 started")
    function3()
    print("Function 2 ended")

def function3():
    print("Function 3 started")
    # 这里引发一个异常
    raise ValueError("An error occurred in function 3")
    print("Function 3 ended")

try:
    function1()
except ValueError as e:
    print(f"Caught an exception: {e}")

print("Program continues execution")
进阶9: 异常

在上面的代码中:

  1. function1 调用了 function2
  2. function2 调用了 function3
  3. function3 引发了一个 ValueError

由于 function3 中的异常没有被那里处理,它会被传播到 function2,然后传播到 function1,最后被外部的 try-except 块捕获并处理,在任何一环中捕捉处理都可以避免报错,任何一环都无法捕捉时,程序才会显示错误信息。

关键要点:

  • 异常向上传递,直到到达一个处理它的 try-except 块。
  • 如果堆栈上的调用中都没有处理异常,程序会终止并输出异常信息。
  • 处理异常的 try-except 块可以在任何层次,只要是异常抛出路径的一部分即可。

处理多个异常

在 Python 中处理多个异常可以使用多个 except 块,或者将多个异常类型放在同一个 except 块中。以下是两种方法的示例:

方法一:使用多个 except 块

try:
    # 尝试执行的代码
    x = int(input("请输入一个数字: "))
    y = 1 / x
except ValueError:
    print("输入的不是一个有效的数字。")
except ZeroDivisionError:
    print("除数不能为零。")
except Exception as e:
    print("捕获到一个异常:", e)

方法二:在一个 except 块中捕获多个异常

try:
    # 尝试执行的代码
    x = int(input("请输入一个数字: "))
    y = 1 / x
except (ValueError, ZeroDivisionError) as e:
    print("请输入一个不为0有效数字:", e)
except Exception as e:
    print("捕获到一个其他异常:", e)

方法三:通配所有异常(不推荐)

虽然这不是一个推荐的做法,但您也可以使用一个 except 块来捕获所有类型的异常。

try:
    # 尝试执行的代码
    x = int(input("请输入一个数字: "))
    y = 1 / x
except Exception as e:
    print("捕获到一个异常:", e)

发布者:LJH,转发请注明出处:https://www.ljh.cool/42142.html

(0)
上一篇 5天前
下一篇 2024年2月21日 下午5:37

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注