亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Python

Python - 异常处理

上一页下一页

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

标准例外列表 -

Sr.No. 异常名称和描述
1

例外

所有异常的基类

2

停止迭代

当迭代器的 next() 方法不指向任何对象时引发。

3

系统退出

由 sys.exit() 函数引发。

4

标准错误

除 StopIteration 和 SystemExit 之外的所有内置异常的基类。

5

算术错误

数值计算发生的所有错误的基类。

6

溢出错误

当计算超出数值类型的最大限制时引发。

7

浮点错误

浮点计算失败时引发。

8

ZeroDivisionError

当所有数值类型发生除零或模零时引发。

9

断言错误

在 Assert 语句失败的情况下引发。

10

属性错误

在属性引用或分配失败的情况下引发。

11

EOF错误

当 raw_input() 或 input() 函数没有输入并且到达文件末尾时引发。

12

导入错误

导入语句失败时引发。

13

键盘中断

当用户中断程序执行时引发,通常通过按 Ctrl+c。

14

查找错误

所有查找错误的基类。

15

索引错误

在序列中未找到索引时引发。

16

密钥错误

在字典中找不到指定的键时引发。

17

名称错误

在本地或全局命名空间中找不到标识符时引发。

18

UnboundLocalError

尝试访问函数或方法中的局部变量但未为其分配值时引发。

19

环境错误

发生在 Python 环境之外的所有异常的基类。

20

IO错误

当输入/输出操作失败时引发,例如 print 语句或试图打开不存在的文件时的 open() 函数。

21

IO错误

引发与操作系统相关的错误。

22

语法错误

当 Python 语法出现错误时引发。

23

缩进错误

未正确指定缩进时引发。

24

系统错误

当解释器发现内部问题时引发,但遇到此错误时 Python 解释器不会退出。

25

系统退出

当使用 sys.exit() 函数退出 Python 解释器时引发。如果没有在代码中处理,导致解释器退出。

26

类型错误

当尝试对指定数据类型无效的操作或函数时引发。

27

值错误

当数据类型的内置函数具有有效的参数类型,但参数指定的值无效时引发。

28

运行时错误

当生成的错误不属于任何类别时引发。

29

NotImplementedError

当需要在继承类中实现的抽象方法没有实际实现时引发。

Python 中的断言

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

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

断言由 assert 语句执行,这是 Python 的最新关键字,在 1.5 版本中引入。

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

断言 声明

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

语法 对于断言是 -

assert Expression[, Arguments]

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

示例

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

现场演示
#!/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!

什么是异常?

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

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

处理异常

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

语法

这是 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. 

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

示例

这个例子打开一个文件,在文件中写入内容,然后优雅地出来,因为完全没有问题 -

现场演示
#!/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

示例

这个例子试图打开一个你没有写权限的文件,所以它引发了一个异常 -

现场演示
#!/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

除了 无例外条款

您也可以使用 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 语句并不被认为是一种好的编程习惯,因为它会捕获所有异常,但不会让程序员找出可能发生的问题的根本原因。

除了 有多个例外的子句

您也可以使用相同的 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. 

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 中的所有语句之后 块被执行,再次引发异常并在 except 中处理 语句如果存在于 try-except 的下一个更高层中 声明。

异常参数

异常可以有一个参数 ,这是一个提供有关问题的附加信息的值。参数的内容因例外而异。您可以通过在 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'

引发异常

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

语法

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

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

最后一个参数 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...

用户定义的异常

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

Python

  1. Python 数据类型
  2. Python 运算符
  3. Python pass 语句
  4. Python 函数参数
  5. Python字典
  6. Python 错误和内置异常
  7. Python 异常处理使用 try、except 和 finally 语句
  8. Python 自定义异常
  9. Python 迭代器
  10. Python 闭包
  11. Python 日期时间
  12. Python 异常处理:try、catch、finally 和 raise [示例]