一、Python 异常处理
Python 中的异常是程序运行时出现的错误,例如索引超出范围、除零错误、文件不存在等。Python 提供了异常处理机制,可以处理异常并防止程序崩溃。
1. 抛出异常
在 Python 中,可以使用raise
语句手动抛出异常。通常情况下,如果发现某种异常情况,就会抛出相应的异常。
1.1 抛出 ValueError
异常
例如,如果用户输入的是负数,则需要抛出ValueError
异常。如下所示:
num = input("Please enter a positive number: ")
if int(num) < 0:
raise ValueError("Error: negative input.")
上述代码中,如果输入的数字小于 0,则抛出ValueError
异常,并提示输入出错。
1.2 抛出自定义异常
另外,我们还可以自定义一些异常,例如MyError
异常。如下所示:
class MyError(Exception):
pass
num = input("Please enter a positive number: ")
try:
if int(num) < 0:
raise MyError("Error: negative input.")
except MyError as e:
print(e)
上述代码定义了一个自定义异常类MyError
,然后判断用户输入是否为负数。如果是负数,就抛出MyError
异常,并打印出异常信息。
2. 自定义异常
可以通过定义异常类,来自定义异常对象。自定义异常类必须继承自Exception
类或其子类,否则将会抛出 TypeError 异常。
下面是一个自定义异常类的示例:
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return self.value
try:
raise MyError("This is a custom error message.")
except MyError as e:
print(e)
上述代码中,自定义了一个异常类MyError
,并在__init__
方法中返回一个异常信息。通过__str__
方法将这个异常信息转为字符串,方便输出。
在主程序中,我们通过raise
语句抛出这个自定义异常,并在except
代码块中捕获并输出异常信息。
3. 传递异常
有时候,在程序中我们需要调用另外一个函数,并传递可能出现的异常。这时候,需要对异常进行处理,否则程序将会崩溃。例如,如下代码中函数func
中调用了函数divide
,可能会出现除 0 错误,需要进行异常处理:
def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("division by zero!")
else:
print("result is", result)
finally:
print("executing finally clause")
def func():
try:
divide(9, 0)
except ZeroDivisionError:
print("Caught an exception in the main program...")
raise
func()
上述代码中,我们首先定义了一个除法函数divide
,并在其中使用try/except/else/finally
语句块。然后在func
函数中调用了divide
函数,并在try/except
语句块中捕获异常。最后,在except
代码块中重新抛出异常。
二、总结
本文介绍了 Python 异常处理相关的知识,包括了如何在 Python 中抛出异常、如何自定义异常、如何传递异常。希望大家可以从中了解到 Python 异常处理的基本方法和常用技巧。
三、示例说明
示例一
下面是一个自定义异常的具体使用示例:
class MyError(Exception):
pass
def func(x):
if x < 0:
raise MyError("Negative input.")
else:
print("Input is positive.")
try:
func(-5)
except MyError as e:
print(e)
上述代码中,我们定义了一个自定义异常类MyError
,然后编写了一个函数func
,如果函数的输入参数为负数,则抛出自定义异常MyError
。
在主程序中,我们进行了异常处理,在try/except
语句块中捕获了这个异常,并输出了异常信息。
示例二
下面是一个传递异常的具体使用示例:
def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("division by zero!")
else:
print("result is", result)
finally:
print("executing finally clause")
def func():
try:
divide(9, 0)
except ZeroDivisionError:
print("Caught an exception in the main program...")
raise
func()
上述代码中,我们首先定义了一个除法函数divide
,并在其中使用try/except/else/finally
语句块。然后在func
函数中调用了divide
函数,并在try/except
语句块中捕获异常。最后,在except
代码块中重新抛出异常。
上述代码中,我们演示了如何传递异常。在divide
函数中,可能会触发ZeroDivisionError
异常,但是我们不想在函数中处理该异常,而是将其传递到上层的调用函数中。因此,在func
函数中,我们捕获了异常,并重新抛出到主程序中。最终程序输出了捕获到的异常信息。