Python 异常处理

1.概述

Python 提供了两个非常重要的功能来处理 Python 程序中的任何意外错误并在其中添加调试功能 -

  • 异常处理- 这将在本教程中介绍。这是 Python 中可用的标准异常列表:标准异常。

  • Assertions - 这将在以下介绍。

标准异常列表:

  • Exception:所有异常的基类
  • StopIteration:当迭代器的 next() 方法不指向任何对象时引发。
  • SystemExit:由 sys.exit() 函数引发。
  • StandardError:除 StopIteration 和 SystemExit 之外的所有内置异常的基类。
  • ArithmeticError:数值计算发生的所有错误的基类。
  • OverflowError:当计算超出数值类型的最大限制时引发。
  • FloatingPointError:当浮点计算失败时引发。
  • ZeroDivisionError:当所有数字类型发生除零或模零时引发。
  • AssertionError:在 Assert 语句失败的情况下引发。
  • AttributeError:在属性引用或分配失败的情况下引发。
  • EOFError:当 raw_input() 或 input() 函数没有输入并且到达文件末尾时引发。
  • ImportError:当导入语句失败时引发。
  • KeyboardInterrupt:当用户中断程序执行时引发,通常通过按 Ctrl+c。
  • LookupError:所有查找错误的基类。
  • IndexError:在序列中未找到索引时引发。
  • KeyError:当在字典中找不到指定的键时引发。
  • NameError:在本地或全局命名空间中找不到标识符时引发。
  • UnboundLocalError:尝试访问函数或方法中的局部变量但未为其分配值时引发。
  • EnvironmentError:在 Python 环境之外发生的所有异常的基类。
  • IOError:当输入/输出操作失败时引发,例如尝试打开不存在的文件时的 print 语句或 open() 函数。
  • SyntaxError:当 Python 语法出现错误时引发。
  • IndentationError:未正确指定缩进时引发。
  • SystemError:当解释器发现内部问题时引发,但遇到此错误时 Python 解释器不会退出。
  • SystemExit:当使用 sys.exit() 函数退出 Python 解释器时引发。如果未在代码中处理,则导致解释器退出。
  • TypeError:当尝试对指定数据类型无效的操作或函数时引发。
  • ValueError:当数据类型的内置函数具有有效的参数类型,但参数指定的值无效时引发。
  • RuntimeError:当生成的错误不属于任何类别时引发。
  • NotImplementedError:当需要在继承的类中实现的抽象方法没有实际实现时引发。

2.Python中的assert

断言是一种健全性检查,您可以在完成程序测试后打开或关闭它。

考虑断言的最简单方法是将其比作raise-if语句(或者更准确地说,是 raise-if-not 语句)。测试表达式,如果结果为假,则引发异常。

断言由 assert 语句执行,它是 Python 的最新关键字。

程序员经常在函数开头放置断言以检查有效输入,并在函数调用之后检查有效输出。

2.1 assert声明

当遇到断言语句时,Python 会计算伴随的表达式,希望这是真的。如果表达式为假,Python 会引发AssertionError异常。

断言的语法是 -

assert Expression[, Arguments]

如果断言失败,Python 使用 ArgumentExpression 作为 AssertionError 的参数。AssertionError 异常可以像使用 try-except 语句的任何其他异常一样被捕获和处理,但如果不处理,它们将终止程序并产生回溯。

2.2 样例

这是一个将温度从开尔文度转换为华氏度的函数。由于开氏零度的温度非常低,因此如果它看到负温度,该功能就会退出 -

#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
   assert (Temperature >= 0),"Colder than absolute zero!"
   return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)

执行上述代码时,会产生以下结果 -

32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!

3.什么是异常?

异常是在程序执行期间发生的事件,它破坏了程序指令的正常流程。通常,当 Python 脚本遇到无法应对的情况时,它会引发异常。异常是表示错误的 Python 对象。

当 Python 脚本引发异常时,它必须要么立即处理异常,要么终止并退出。

4.处理异常

如果您有一些可能引发异常的可疑代码,您可以通过将可疑代码放在try:块中来保护您的程序。在 try: 块之后,包含一个except:语句,然后是一个尽可能优雅地处理问题的代码块。

4.1 语法

这是try....except...else块的简单语法 -

try:
   You do your operations here;
   ......................
except ExceptionI:
   If there is ExceptionI, then execute this block.
except ExceptionII:
   If there is ExceptionII, then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

以下是关于上述语法的几个要点 -

  • 一个 try 语句可以有多个 except 语句。当 try 块包含可能引发不同类型异常的语句时,这很有用。
  • 您还可以提供一个通用的 except 子句,它处理任何异常。
  • except 子句之后,您可以包含一个 else 子句。如果 try: 块中的代码没有引发异常,则执行 else 块中的代码。
  • else 块是不需要 try: 块保护的代码的好地方。

4.2样例(1)

这个例子打开一个文件,在文件中写入内容-

#!/usr/bin/python

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print "Error: can\'t find file or read data"
else:
   print "Written content in the file successfully"
   fh.close()

这会产生以下结果 -

Written content in the file successfully

4.3样例(2)

此示例尝试打开您没有写入权限的文件,因此会引发异常 -

#!/usr/bin/python

try:
   fh = open("testfile", "r")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print "Error: can\'t find file or read data"
else:
   print "Written content in the file successfully"

这会产生以下结果 -

Error: can't find file or read data

4.4没有异常的except条款

您还可以使用没有异常的 except 语句,定义如下 -

try:
   You do your operations here;
   ......................
except:
   If there is any exception, then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

这种try-except语句会捕获所有发生的异常。但是,使用这种 try-except 语句并不被认为是一种好的编程习惯,因为它会捕获所有异常,但不会使程序员确定可能发生的问题的根本原因。

4.5带有多个异常的except子句

您还可以使用相同的except语句来处理多个异常,如下所示 -

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

4.6 try-finally 子句

您可以使用finally:块和try:块。finally 块是放置无论 try 块是否引发异常都必须执行的代码的地方。try-finally 语句的语法是这样的 -

try:
   You do your operations here;
   ......................
   Due to any exception, this may be skipped.
finally:
   This would always be executed.
   ......................

您不能同时使用else子句和 finally 子句。

#!/usr/bin/python

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
finally:
   print("Error: can\'t find file or read data")

如果您无权以写入模式打开文件,则会产生以下结果 -

Error: can't find file or read data

同样的例子可以写得更清楚如下 -

#!/usr/bin/python

try:
   fh = open("testfile", "w")
   try:
      fh.write("This is my test file for exception handling!!")
   finally:
      print("Going to close the file")
      fh.close()
except IOError:
   print("Error: can\'t find file or read data")

try块中抛出异常时,执行立即转到finally块。在finally块中的所有语句都执行完之后,再次引发异常,如果出现在try-except语句的下一个更高层中,则在except语句中进行处理。

4.7 异常的参数

异常可以有一个参数,它是一个提供有关问题的附加信息的值。参数的内容因异常而异。您可以通过在 except 子句中提供一个变量来捕获异常的参数,如下所示 -

try:
   You do your operations here;
   ......................
except ExceptionType, Argument:
   You can print value of Argument here...

如果您编写代码来处理单个异常,则可以在 except 语句中的异常名称后面添加一个变量。如果要捕获多个异常,则可以在异常元组后面添加一个变量。

这个变量接收异常的值,主要包含异常的原因。变量可以接收单个值或元组形式的多个值。该元组通常包含错误字符串、错误编号和错误位置。

  • 以下是单个异常的示例 -
#!/usr/bin/python

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError, Argument:
      print("The argument does not contain numbers\n", Argument)

# Call above function here.
temp_convert("xyz");
# 这会产生以下结果 -
# The argument does not contain numbers
# invalid literal for int() with base 10: 'xyz'

4.8 引发异常

您可以使用 raise 语句以多种方式引发异常。raise语句的一般语法如下。

raise [Exception [, args [, traceback]]]

这里,Exception是异常的类型(例如 NameError),argument是异常参数的值。argument参数是可选的;如果未提供,则异常参数为无。

最后一个参数 traceback 也是可选的(在实践中很少使用),如果存在,则是用于异常的 traceback 对象。

异常可以是字符串、类或对象。Python 核心引发的大多数异常都是类,其参数是类的实例。定义新的异常非常容易,可以按如下方式完成 -

def functionName( level ):
   if level < 1:
      raise "Invalid level!", level
      # The code below to this would not be executed
      # if we raise the exception

注意:为了捕获异常,“except”子句必须引用类对象或简单字符串引发的相同异常。例如,要捕获上述异常,我们必须编写 except 子句如下 -

try:
   Business Logic here...
except "Invalid level!":
   Exception handling here...
else:
   Rest of the code here...

4.9用户定义的异常

Python 还允许您通过从标准内置异常派生类来创建自己的异常。

这是一个与RuntimeError相关的示例。在这里,创建了一个从RuntimeError子类化的类。当您需要在捕获异常时显示更具体的信息时,这很有用。

try 块中,引发用户定义的异常并在 except 块中捕获。变量 e 用于创建类Networkerror的实例。

class Networkerror(RuntimeError):
   def __init__(self, arg):
      self.args = arg

所以一旦你定义了上面的类,你可以引发如下异常 -

try:
   raise Networkerror("Bad hostname")
except Networkerror,e:
   print(e.args)

参考目录

https://www.tutorialspoint.com/python/python_exceptions.htm

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值