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

异常处理原理
异常传播:当异常在一个代码块中被引发时,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")
在上面的代码中:
- function1调用了- function2。
- function2调用了- function3。
- 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)自定义异常类
在 Python 中,自定义异常是通过创建一个继承自 Exception 类的新类来实现的。这使得你能够创建特定于你的应用程序的错误类型,从而更好地处理异常情况。下面是如何定义和使用自定义异常的示例。
定义自定义异常
class MyCustomError(Exception):
    """自定义异常类的简单示例"""
    def __init__(self, message):
        super().__init__(message)
        self.message = message
    def __str__(self):
        return f"MyCustomError: {self.message}"使用自定义异常
可以像使用内置异常一样使用自定义异常,使用 raise 关键字来抛出异常,并使用 try 和 except 块来捕获异常。
def divide(x, y):
    if y == 0:
        raise MyCustomError("除数不能为零")
    return x / y
try:
    result = divide(10, 0)
except MyCustomError as e:
    print(e)在这个例子中,我们定义了一个名为 MyCustomError 的自定义异常,并在除法函数中使用它来处理除数为零的情况。然后,在 try 块中调用该函数,并捕获可能抛出的 MyCustomError。
可以为自定义异常类添加更多的属性和方法,以包含更多的错误信息。通过自定义异常,可以更好地在日志中记录详细的错误信息,有助于排查问题。
发布者:LJH,转发请注明出处:https://www.ljh.cool/42142.html
 
                