在Python编程中,错误(Errors)和异常(Exceptions)是两种不同类型的运行时问题,但通常都被称为“异常”。理解并正确处理这些异常对于编写健壮和可靠的代码至关重要。

错误(Errors)

错误通常是由于Python解释器或编译器在解析代码时遇到的语法问题,这些问题使得代码无法执行。错误是语法问题,通常会在代码解析时被发现。

例如:

def hello():
    print("Hello, World!"

运行结果如下:

> python error_demo.py
  File "error_demo.py", line 2
    print("Hello, World!"
         ^
SyntaxError: '(' was never closed

在这个例子中,由于缺少函数调用括号,Python解释器会抛出一个SyntaxError错误。

异常(Exceptions)

异常是在代码执行过程中发生的运行时问题,通常是由于程序中的某些操作无法按照预期进行。异常是运行时问题,通常是由于某些操作无法按预期执行。

例如:

result = 10 / 0

运行结果如下:

> python exception_demo.py
Traceback (most recent call last):
  File "exception_demo.py", line 1, in <module>
    result = 10 / 0
             ~~~^~~
ZeroDivisionError: division by zero

在这个例子中,由于尝试除以零,Python会抛出一个ZeroDivisionError异常。

异常处理

Python提供了try、except和finally关键字来处理异常。

  • try块:放置可能引发异常的代码。
  • except块:处理特定类型的异常。
  • finally块:无论是否发生异常,都会执行finally块中的代码。
try:
    result = 10 / 0
except ZeroDivisionError:
    print("除数为0")
finally:
    print("无论如何都会执行")

运行结果如下:

除数为0
无论如何都会执行

在这个例子中,当尝试除以零时,ZeroDivisionError异常被捕获,并打印出错误消息。无论是否发生异常,finally块中的代码都会执行。

捕获多个异常

你可以使用多个except块来捕获不同类型的异常,或者在一个except块中指定多个异常类型:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("ZeroDivisionError")
except ValueError:
    print("ValueError")

try:
    value = int("abc")
except (ZeroDivisionError, ValueError):
    print("ZeroDivisionError or ValueError")

运行结果如下:

ZeroDivisionError
ZeroDivisionError or ValueError

获取异常信息

在except块中,你可以通过as关键字将异常对象赋值给一个变量,然后打印或处理这个异常对象的信息。

try:
    value = int("abc")
except (ZeroDivisionError, ValueError) as e:
    print("error:", e)

运行结果如下:

error:  invalid literal for int() with base 10: 'abc'

自定义异常

Python允许你定义自己的异常类,通过继承内置的BaseException类来实现。

class CustomException(BaseException):
    def __init__(self, message):
        super().__init__(message)
        self.message = message

    def __str__(self):
        return self.message


try:
    raise CustomException("这是一个自定义异常!")
except CustomException as e:
    print(e)

运行结果如下:

这是一个自定义异常!