python 异常的传递性及主动抛出学习

作者:Dante丶 时间:2021-03-19 05:02:38 

异常的传递性

在 Python 中,异常的传递性指的是,当一个异常没有被处理时,它会沿着调用栈向上抛出,直到被处理或者导致程序崩溃。

具体来说,当一个函数内部发生了异常但是没有进行处理时,该异常会向上抛出给调用该函数的代码块。如果这个代码块也没有处理该异常,那么异常会继续向上抛出,直到找到能够处理该异常的代码块或程序中止运行。

下面是一个简单的例子来演示异常的传递性:

def func1():
   print("func1 开始")
   func2()
   print("func1 结束")
def func2():
   print("func2 开始")
   func3()
   print("func2 结束")
def func3():
   print("func3 开始")
   a = 1 / 0   # 引发 ZeroDivisionError 异常
   print("func3 结束")
try:
   func1()
except Exception as e:
   print("错误信息:", e)

在上述代码中,函数 func3() 发生了除零错误( ZeroDivisionError ),但是没有处理该异常。因此,该异常会向上抛出给调用 func3() 的代码块 func2() ,而 func2() 也没有处理该异常,所以异常会继续向上抛出给调用 func2() 的代码块 func1() 。最终,在 func1() 中的 try...except... 语句块捕获到了异常,并输出了错误信息。

总之,在编写完整的程序时,我们应该注意处理可能出现的异常,从而避免异常的传递和程序的崩溃。

主动抛出异常

在 Python 中,我们可以使用内置的 Exception 类来抛出异常。Exception 是所有标准异常的基类,当我们自定义异常时也可以继承该类。通过继承 Exception 类,我们可以很方便地创建自己的异常类型,并定义相应的处理方式。

下面是一个使用 Exception 抛出自定义异常的代码示例:

def func(value):
   if value < 0:
       # 如果参数小于0,则抛出自定义异常
       raise Exception("参数不能小于0")
   else:
       print(f"参数值为:{value}")
try:
   # 调用带参数的函数
   func(-1)
except Exception as e:
   # 捕获自定义异常并输出错误信息
   print(e)

在上述代码中,当传入的参数小于 0 时,我们使用 raise 语句抛出 Exception 异常,并将错误信息一同抛出。最后,在主程序中,我们调用带参数的 func() 函数,并在捕获到自定义异常时输出错误信息。

需要注意的是,使用 Exception 抛出异常可能会导致代码结构不太清晰,因为它可以抛出任何种类的异常,包括系统内置的异常和自定义的异常。因此,如果想要更好地控制异常的类型和处理方式,建议还是使用专门的异常类或者自定义的异常类。

来源:https://juejin.cn/post/7208108117837660216

标签:python,异常传递,主动抛出
0
投稿

猜你喜欢

  • ThinkPHP5中如何使用redis

    2023-06-13 01:09:10
  • 用Python设计一个经典小游戏

    2023-07-11 02:57:09
  • pandas DataFrame 警告(SettingWithCopyWarning)的解决

    2023-08-20 07:45:31
  • Django跨域请求问题的解决方法示例

    2023-05-25 13:28:27
  • sql2005 存储过程分页示例代码

    2024-01-13 03:09:06
  • 能否用显示/隐藏层来控制FLASH播放与停止

    2008-10-27 14:08:00
  • asp中字符编码转换的10个函数[荐]

    2007-11-11 10:32:00
  • 如何利用Python随机从list中挑选一个元素

    2023-08-04 00:05:54
  • js删除数组中指定元素的几种方式

    2024-04-10 10:50:48
  • python逐行读写txt文件的实例讲解

    2023-09-27 14:17:55
  • PHP实现判断二叉树是否对称的方法

    2023-06-28 13:24:10
  • Golang实现单元测试中的接口层

    2024-04-26 17:17:29
  • 在ASP.NET 2.0中操作数据之十:使用 GridView和DetailView实现的主/从报表

    2023-07-02 20:22:40
  • 如何正确使用开源项目?

    2023-01-29 22:14:57
  • 关于设计的一些个人看法

    2008-06-12 12:44:00
  • python使用matplotlib绘制雷达图

    2022-10-10 16:37:41
  • python中if-elif-else语句实例用法讲解

    2023-03-08 21:59:05
  • 用ASP打造一个小型的网页BBS系统

    2008-10-10 16:36:00
  • python微信跳一跳系列之棋子定位像素遍历

    2023-11-04 01:27:47
  • ElementUI中Tree组件使用案例讲解

    2024-04-28 10:19:58
  • asp之家 网络编程 m.aspxhome.com