一文掌握python异常处理(try...except...)

目录

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...语句来实现的,这是一种结构化的方式来处理程序运行过程中可能出现的错误情况,保证程序的健壮性和连续运行。

1、基础结构

基本的异常处理结构包括try块、一个或多个except块,以及可选elsefinally块。

try:
    # 尝试执行的代码
    ...
except ExceptionType1:
    # 处理特定类型的异常
    ...
except (ExceptionType2, ExceptionType3):
    # 处理多种异常类型
    ...
else:
    # 如果没有异常发生,执行这里的代码
    ...
finally:
    # 不管是否发生异常,都会执行这里的代码
    ...

2、try

  • 作用:包含可能引发异常的代码。
  • 说明:当Python遇到一个错误时,它会停止当前块的执行,并寻找相应的except块。

3、except

  • 作用:捕获并处理特定类型的异常。
  • 语法:可以指定一个或多个except块来捕获不同类型的异常。如果未指定异常类型,默认捕获所有异常。
  • 参数:可以访问异常对象,通过as关键字命名,如except Exception as e

4、else

  • 作用:如果没有异常发生,执行这里的代码。
  • 特点:它是可选的,仅当try块中的所有代码执行完毕且未引发异常时执行。

5、finally

  • 作用:无论是否发生异常,都会执行这里的代码。
  • 用途:非常适合放置清理资源的代码,如关闭文件或数据库连接。

6、自定义异常

Python允许你定义自己的异常类,继承自内置的Exception类或其子类。

class MyCustomError(Exception):
    def __init__(self, message):
        super().__init__(message)

7、抛出异常

使用raise语句主动抛出异常。

if some_condition:
    raise MyCustomError("Something went wrong!")

8、常用的内置异常类型

1)、Exception:捕捉所有异常。

Exception是大多数内建异常的基类(不包括SystemExit, KeyboardInterrupt, GeneratorExit等系统退出异常),所以它可以捕获除了系统退出异常之外的所有异常。

try:
    a = 1/0
except Exception as e:
    print(f"Caught an error: {e}")

2)、BaseException:所有异常的基类。通常不应该直接捕获这个类的实例,除非你确实打算捕获所有异常。

try:
    a = 1/0
except BaseException as b:
    print(f"Caught an error: {b}")

3)、SyntaxError:Python语法错误,比如拼写错误或不正确的语句结构。

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")

4)、ImportError:尝试导入模块或包失败时引发。

try:
    import non_existent_module  # 尝试导入一个不存在的模块
except ImportError as e:
    print(f"无法导入模块: {e}")
    # 这里可以添加其他错误处理逻辑,比如使用备选方案、记录日志等

5)、IndexError:索引超出序列(如列表、元组)范围时引发。

my_list = [1, 2, 3]

try:
    # 尝试访问一个不存在的索引,比如列表长度之外的位置
    print(my_list[3])
except IndexError as e:
    print("尝试访问的索引超出范围:", e)

6)、KeyError:尝试访问字典中不存在的键时引发。

my_dict = {'name': 'Alice', 'age': 30}

try:
    # 尝试访问一个不存在的键
    print(my_dict['country']

你可能感兴趣的:(python,python,开发语言)