Python中的异常处理学习笔记

作者:junjie 时间:2023-06-26 05:04:29 

Python 是面向对象的语言,所以程序抛出的异常也是类。

常见的异常类

1.NameError:尝试访问一个没有申明的变量
2.ZeroDivisionError:除数为 0
3.SyntaxError:语法错误
4.IndexError:索引超出序列范围
5.KeyError:请求一个不存在的字典关键字
6.IOError:输入输出错误(比如你要读的文件不存在)
7.AttributeError:尝试访问未知的对象属性
8.TypeError:传给函数的参数类型不正确,比如给 int 函数传入字符型

自定义异常类

尽管内建的异常类已经包括大部分情况,但如果需要创建自己的异常类,可以采用下面的方法:


class CustomException(Exception): # Exception 为所有异常的基类
    # 处理异常的代码

捕获异常


try: 
   # 需要进行捕获异常的代码,只有出现异常之前的代码被最终执行
except (Exception1,Exception2,...) as argument: 
   # 捕获到 (Exception1,Exception2,...) 里的异常才执行本段代码
   # argument 是一个异常类的实例,包含异常的具体信息
except:
   # 捕获到 (Exception1,Exception2,...) 以外的异常执行本段代码,用 sys 模块的 exc_info() 函数可以获取异常信息
else: 
   # 如果没有捕获到异常则执行本段代码
finally: 
   # 无论是否捕获到异常都执行本段代码


上述语句并不都是必须的,譬如 try...except...、try...finally... 或者 try...except...else... 语句都是可行的。我们还可以 用 try...except...else... 代替 if...else...。

抛出异常

如果我们想要在自己编写的程序中主动抛出异常,可以采用如下两种方法:

raise Exception(reason)

Exception 必须是一个异常类的名称。可选项 reason 用来传递异常的信息。

assert expression[,reason]

assert 是断言的关键字。当表达式 expression 为真则什么都不做,否则抛出 AssertionError 异常。reason 提供异常的信息。

上下文管理器

由于对象 File 支持上下文管理协议,因此可以采用下面的方法打开文件:


with open('filename') as fp:
   # 无论本段代码是否出现异常,文件对象 fp 均能正确关闭

Example


import sys

def div(num, den):
 print('_________________   (',num,',',den,')\n')
 try:
  ans = num/den
  assert den != num, 'Equal' # 断言:分子分母不相等
  den = 'Changed'            # 如果执行本语句之前未出现异常,改变 den 的值
  if num % 2:                # 如果分子为奇数,则抛出异常
   raise ValueError('Odd')
 except ZeroDivisionError as e:
  print('except ... as ...\n\t', e)
 except:
  print('except\n\t', sys.exc_info())
 else:
  print('else\n\t', ans)
 finally:
  print('finally\n\t', den)

div(1,0) # 除数为零,为 ZeroDivisionError 异常类
div(1,1) # 分子等于分母,断言为假,抛出异常
div(2,1) # 无异常
div(3,1) # 分子为奇数,通过 raise 抛出异常
div(3,'x') # 不属于 ZeroDivisionError 的其他异常

运行结果:


_________________   ( 1 , 0 )

except ... as ...
  division by zero
finally
  0
_________________   ( 1 , 1 )

except
  (<class 'AssertionError'>, AssertionError('Equal',), <traceback object at 0x00000000029B42C8>)
finally
  1
_________________   ( 2 , 1 )

else
  2.0
finally
  Changed
_________________   ( 3 , 1 )

except
  (<class 'ValueError'>, ValueError('Odd',), <traceback object at 0x00000000029B42C8>)
finally
  Changed
_________________   ( 3 , x )

except
  (<class 'TypeError'>, TypeError("unsupported operand type(s) for /: 'int' and 'str'",), <traceback object at 0x00000000029B42C8>)
finally
  x

标签:Python,异常处理
0
投稿

猜你喜欢

  • 微信小程序实现搜索框功能

    2024-04-16 10:31:05
  • Go语言中序列化与反序列化示例详解

    2024-02-10 11:43:57
  • SQL数据库十四种案例介绍

    2024-01-14 14:50:42
  • 详解使用Nginx和uWSGI配置Python的web项目的方法

    2021-06-28 00:24:47
  • appium测试之APP元素定位及基本工具介绍

    2021-09-24 20:51:47
  • vue中v-model指令与.sync修饰符的区别详解

    2024-05-28 15:46:10
  • javascript利用apply和arguments复用方法

    2024-04-16 09:13:19
  • python中sys模块是做什么用的

    2021-04-30 10:04:48
  • asp如何获知文件最后的修改日期和时间?

    2009-11-24 20:49:00
  • VSCode的使用配置以及VSCode插件的安装教程详解

    2023-05-31 14:48:46
  • Python实现计算函数或程序执行时间

    2022-03-22 14:28:28
  • Python实现二维数组按照某行或列排序的方法【numpy lexsort】

    2022-03-13 05:06:31
  • python修改list中所有元素类型的三种方法

    2023-10-02 15:26:29
  • 详解python 3.6 安装json 模块(simplejson)

    2023-08-04 10:55:03
  • python 获取当前目录下的文件目录和文件名实例代码详解

    2022-07-21 21:31:25
  • python中resample函数实现重采样和降采样代码

    2022-10-24 05:49:23
  • Python如何转换字符串大小写

    2021-03-16 17:40:20
  • Python中正反斜杠(‘/’和‘\\’)的意义与用法

    2023-01-22 14:45:04
  • 如何在windows下安装Pycham2020软件(方法步骤详解)

    2023-05-19 14:07:30
  • thinkPHP5.0框架简单配置作用域的方法

    2023-11-14 10:24:51
  • asp之家 网络编程 m.aspxhome.com