目录
1、基础结构
2、try块
3、except块
4、else块
5、finally块
6、自定义异常
7、抛出异常
8、常用的内置异常类型
1)、Exception:捕捉所有异常。
2)、BaseException:所有异常的基类。通常不应该直接捕获这个类的实例,除非你确实打算捕获所有异常。
3)、SyntaxError:Python语法错误,比如拼写错误或不正确的语句结构。
4)、ImportError:尝试导入模块或包失败时引发。
5)、IndexError:索引超出序列(如列表、元组)范围时引发。
6)、KeyError:尝试访问字典中不存在的键时引发。
7)、ValueError:传给函数的参数具有正确的类型,但却是无效的值时引发。例如,int('abc')会引发ValueError。
8)、TypeError:操作或函数应用于不适当类型的对象时引发。例如,对整数进行拼接操作1 + "string"会引发TypeError。
9)、ZeroDivisionError:除数为零时引发。
10)、FileNotFoundError:尝试打开不存在的文件时引发。
11)、IOError(Python 2中)/ OSError(Python 3中):输入/输出操作失败时引发,如文件不存在、权限问题等。
12)、AttributeError:尝试访问对象不存在的属性时引发。
13)、NameError:尝试访问未定义的变量名时引发。
14)、KeyboardInterrupt:用户中断执行(通常是通过Ctrl+C)时引发。
15)、StopIteration:迭代器没有更多的项目时引发,通常在for循环中自动处理。
16)、RuntimeError:一般性的运行时错误,不归类于其他异常类时使用。
17)、NotImplementedError:抽象方法需要在子类中实现但没有实现时引发。
18)、AssertionError:当assert语句失败时引发。
9、几个实例
1)文件操作
2)数学运算
3)网络请求
4)自定义异常处理
小结
在Python中,异常处理是通过try...except...
语句来实现的,这是一种结构化的方式来处理程序运行过程中可能出现的错误情况,保证程序的健壮性和连续运行。
基本的异常处理结构包括try
块、一个或多个except
块,以及可选的else
和finally
块。
try:
# 尝试执行的代码
...
except ExceptionType1:
# 处理特定类型的异常
...
except (ExceptionType2, ExceptionType3):
# 处理多种异常类型
...
else:
# 如果没有异常发生,执行这里的代码
...
finally:
# 不管是否发生异常,都会执行这里的代码
...
try
块except
块。except
块except
块来捕获不同类型的异常。如果未指定异常类型,默认捕获所有异常。as
关键字命名,如except Exception as e
。else
块try
块中的所有代码执行完毕且未引发异常时执行。finally
块Python允许你定义自己的异常类,继承自内置的Exception
类或其子类。
class MyCustomError(Exception):
def __init__(self, message):
super().__init__(message)
使用raise
语句主动抛出异常。
if some_condition:
raise MyCustomError("Something went wrong!")
Exception
是大多数内建异常的基类(不包括SystemExit
, KeyboardInterrupt
, GeneratorExit
等系统退出异常),所以它可以捕获除了系统退出异常之外的所有异常。
try:
a = 1/0
except Exception as e:
print(f"Caught an error: {e}")
try:
a = 1/0
except BaseException as b:
print(f"Caught an error: {b}")
SyntaxError
通常是在编译代码时由Python解释器抛出的,而不是在运行时。这意味着不能在一个常规的try-except
块中直接捕获SyntaxError
,因为try
块中的代码在尝试捕获异常之前就已经被编译了。
然而,如果想要模拟处理SyntaxError
的情况,可以考虑使用exec
函数来动态执行字符串形式的代码,这样就可以在try-except
块中捕获由这些代码引发的SyntaxError
。以下是一个例子:
try:
# 使用exec来动态执行字符串形式的代码
exec("if 5 > 3 \nprint('5 is greater than 3')") # 注意这里故意缺少了冒号
except SyntaxError as e:
# 捕获SyntaxError并打印错误信息
print("Caught a SyntaxError:", e)
# 正确的代码直接运行
if 5 > 3:
print("5 is greater than 3")
try:
import non_existent_module # 尝试导入一个不存在的模块
except ImportError as e:
print(f"无法导入模块: {e}")
# 这里可以添加其他错误处理逻辑,比如使用备选方案、记录日志等
my_list = [1, 2, 3]
try:
# 尝试访问一个不存在的索引,比如列表长度之外的位置
print(my_list[3])
except IndexError as e:
print("尝试访问的索引超出范围:", e)
my_dict = {'name': 'Alice', 'age': 30}
try:
# 尝试访问一个不存在的键
print(my_dict['country']