资讯专栏INFORMATION COLUMN

python基础教程:错误处理和异常处理(二)

wujl596 / 3515人阅读

摘要:语句就是帮助我们抛出知道异常的,比如的使用很简单,它的语法如下如果它后面不带表达式参数,它会重新引发当前作用域内最后一个激活的异常。,用于异常的串联。自定义的异常类的名称通常以错误结尾,类似与内置标准异常的命名。

前面我们讲到的Python编程过程中,在可能出现异常的地方使用尝试语句,来正确的处理一些异常,可以保证程序不中断继续运行。

抛出异常

有时候,我们可能需要在程序的某些地方主动抛出异常,通知调用该代码的程序有错误发生这时候,我们就要用到。raise语句。raise语句就是帮助我们抛出知道异常的,比如:

In [6]: raise NameError("Bad Name")
-----------------------------------
NameError           Traceback (most recent call last)
 in 
----> 1 raise NameError("Bad Name")

NameError: Bad Name

raise的使用很简单,它的语法如下:

raise [expression [from expression]]

如果它后面不带表达式(参数),它会重新引发当前作用域内最后一个激活的异常。如果当前作用域内没有激活的异常,将会引发RuntimeError来提示错误。

如果后面带有表达式,则将表达式求值为要抛出的异常对象,该表达式必须是一个异常实例或者是一个异常类(自继承BaseException类)。如果它是一个异常类,它将通过调用没有参数的构造函数来隐式实例化:

raise NameError  # 等同于 "raise NameError()"

raise后面表达式还可以跟一个from¸...。,用于异常的串联。from子句的表达式必须是另一个异常或实例,它将作为可写的(可写入的)的__cause__属性被关联到所引发的异常。如果引发的异常未被捕捉处理,两个异常都将被打印出来:

In [9]: try: 
   ...:     print(10/0) 
   ...: except Exception as e: 
   ...:     raise RuntimeError("something is wrong") from e 
   ...:
----------------------------------------------------------
ZeroDivisionError            Traceback (most recent call last)
 in 
      1 try:
----> 2     print(10/0)
      3 except Exception as e:

ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

RuntimeError                 Traceback (most recent call last)
 in 
      2     print(10/0)
      3 except Exception as e:
----> 4     raise RuntimeError("something is wrong") from e
      5 

RuntimeError: something is wrong

如果异常一个在except[主语]或finally[主语]中被抛出,类似的机制会隐式地发挥作用,的之前将异常关联被新到异常的__context__属性例如:

In [10]: try: 
    ...:     print(10/0) 
    ...: except: 
    ...:     raise RuntimeError("something is wrong") 
    ...:
-----------------------------------------------
ZeroDivisionError           Traceback (most recent call last)
 in 
      1 try:
----> 2     print(10/0)
      3 except:

ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

RuntimeError                Traceback (most recent call last)
 in 
      2     print(10/0)
      3 except:
----> 4     raise RuntimeError("something is wrong")
      5 

RuntimeError: something is wrong

串连异常柯林斯通过在from[主语]中用None来显示地禁止:

In [11]: try: 
    ...:     print(10/0) 
    ...: except: 
    ...:     raise RuntimeError("something is wrong") from None 
    ...:
-------------------------------
RuntimeError                   Traceback (most recent call last)
 in 
      2     print(10/0)
      3 except:
----> 4     raise RuntimeError("something is wrong") from None
      5 

RuntimeError: something is wrong
用户自定义异常

Python的允许用户自定义异常类,应该通常直接或间接地继承自Exception类。

自定义的异常类的名称通常以“错误”结尾,类似与内置标准异常的命名。自定义的异常类,可以像其它类那样可以执行任何操作,但通常保持简单,只提供用以处理程序为异常提取有关错误信息的属性为模块自定义多个不同错误的异常时,通常是为该模块定义一个异常基类,再为不同错误创建特定的子类例如。:

class ModuleError(Exception):
    """模块的异常基类"""
    pass

class ModuleNameError(ModuleError):
    """模块的特定异常子类"""
    pass

class ModuleValueError(ModuleError):
    """模块的另一个特定异常子类"""
    pass
最后的清理操作:finally子句

finally的英文[主语] try语句的一个可选[主语],用于定义在任何情况下都执行的操作,叫做“清理操作”例如:

In [12]: try: 
    ...:     raise NameError 
    ...: finally: 
    ...:     print("Bye :)") 
    ...:      
    ...:
Bye :)
-------------------------------
NameError        Traceback (most recent call last)
 in 
      1 try:
----> 2     raise NameError
      3 finally:
      4     print("Bye :)")
      5 

NameError: 

finally子句总会在离开try语句前被执行,无论发生异常与否。当在try子句中发生了异常且尚未被except子句处理(或者它发生在除或其他子句中)时,该异常将在终子句执行后被重新抛出。当try语句的任何其他子句通过break,continue或return语句离开时,最后也会在“离开之前”被执行,参考下面这个更复杂的例子:

In [13]: def divide(a, b): 
    ...:     try: 
    ...:         result = a / b 
    ...:     except ZeroDivisionError: 
    ...:         print("divided by zero!") 
    ...:     else: 
    ...:         print("result is", result) 
    ...:     finally: 
    ...:         print("leaving try") 
    ...:

In [14]: divide(8, 2)
result is 4.0
leaving try

In [15]: divide(8, 0)
divided by zero!
leaving try

In [16]: divide("a", 2)
leaving try
-----------------------
TypeError              Traceback (most recent call last)
 in 
----> 1 divide("a", 2)

 in divide(a, b)
      1 def divide(a, b):
      2     try:
----> 3         result = a / b
      4     except ZeroDivisionError:
      5         print("divided by zero!")

TypeError: unsupported operand type(s) for /: "str" and "int"

从上面的例子我们看到,finally子句总是会被执行。字符串但被除时引发了TypeError的异常,异常这个没有被except¸...。处理,在就会finally¸...。执行后被重新抛出。

在编程实践中,finally子句对释放文件或网络连接等外部资源是非常有用的。

总结

编程中,我们不仅要在恰当的地方处理异常,也要在必要的时候抛出异常,我们抛出异常时可以自定义异常。熟练运用异常可以使我们的程序更加健壮,别忘了必要的时候使用finally来释放外部资源。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43846.html

相关文章

  • python基础教程错误处理异常处理

    摘要:在前面介绍语法的过程中,我们已经接触到了解释器给的错误和异常,但并没有详细讲解它们。解释器这样报出的好处是告诉我们哪一行代码出错了错误的类型是什么。 在前面介绍Python语法的过程中,我们已经接触到了解释器给的错误和异常,但并没有详细讲解它们。现在我们就全面的来学习Python是对语法错误等错误进行定义和处理的,这包括至少有两种可以区分的错误,它们是语法错误和异常。 语法错误 Pyt...

    tinylcy 评论0 收藏0
  • 基础如何学爬虫技术

    摘要:楚江数据是专业的互联网数据技术服务,现整理出零基础如何学爬虫技术以供学习,。本文来源知乎作者路人甲链接楚江数据提供网站数据采集和爬虫软件定制开发服务,服务范围涵盖社交网络电子商务分类信息学术研究等。 楚江数据是专业的互联网数据技术服务,现整理出零基础如何学爬虫技术以供学习,http://www.chujiangdata.com。 第一:Python爬虫学习系列教程(来源于某博主:htt...

    KunMinX 评论0 收藏0
  • python基础教程:内置函数(

    摘要:继续讲述更多的的内置函数。传递以切换缓冲关闭仅允许在二进制模式下,选择行缓冲仅在文本模式下可用,并且的整数以指示固定大小的块缓冲区的大小以字节为单位。启动内置的帮助系统此函数主要在交互式中使用。 继续讲述更多的Python的内置函数。 showImg(https://segmentfault.com/img/remote/1460000019193976); IO操作 input([p...

    xiaodao 评论0 收藏0
  • ❤️Python异常捕获处理❤️保姆式教学,代码异常报错也能那么谐且个性!

    ?前言 代码出现异常而报错再正常不过了,但为什么要处理异常? 由于异常的存在,代码运行时会出现一大堆的红色字体提示,对于程序员还好,见红色报错见多了习惯了,但如果你开发出来的东西要给别人看,那么不懂代码的人就会一脸懵逼,对产品的印象都不太好了。 比如我们经常简单网页丢失的情况,其实是就是网页代码执行时发生了异常,但有的网页还是很个性的,提示的信息可能是比较人性化的,比如CSDN你收藏的文章被后台删...

    awesome23 评论0 收藏0

发表评论

0条评论

wujl596

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<