第七章 Python异常处理

简介:

什么是异常?

顾名思义,异常就是程序因为某种原因无法正常工作了,比如缩进错误、缺少软件包、环境错误、连接超时等等都会引发异常。一个健壮的程序应该把所能预知的异常都应做相应的处理,应对一些简单的异常情况,使得更好的保证程序长时间运行。即使出了问题,也可让维护者一眼看出问题所在。因此本章节讲解的就是怎么处理异常,让你的程序更加健壮。

7.1 捕捉异常语法

1
2
3
4
5
try ... except ...
try :
      expression
except  [Except  Type ]:
      expression

7.2 异常类型

常见的异常类型:

异常类型

用途

SyntaxError 语法错误
IndentationError 缩进错误
TypeError  
对象类型与要求不符合
ImportError 模块或包导入错误;一般路径或名称错误
KeyError
字典里面不存在的键
NameError 变量不存在
IndexError 下标超出序列范围
IOError 输入/输出异常;一般是无法打开文件
AttributeError 对象里没有属性
KeyboardInterrupt 键盘接受到Ctrl+C
Exception 通用的异常类型;一般会捕捉所有异常

还有一些异常类型,可以通过dir查看:

1
2
3
>>>  import  exceptions
>>>  dir (exceptions)
[ 'ArithmeticError' 'AssertionError' 'AttributeError' 'BaseException' 'BufferError' 'BytesWarning' 'DeprecationWarning' 'EOFError' 'EnvironmentError' 'Exception' 'FloatingPointError' 'FutureWarning' 'GeneratorExit' 'IOError' 'ImportError' 'ImportWarning' 'IndentationError' 'IndexError' 'KeyError' 'KeyboardInterrupt' 'LookupError' 'MemoryError' 'NameError' 'NotImplementedError' 'OSError' 'OverflowError' 'PendingDeprecationWarning' 'ReferenceError' 'RuntimeError' 'RuntimeWarning' 'StandardError' 'StopIteration' 'SyntaxError' 'SyntaxWarning' 'SystemError' 'SystemExit' 'TabError' 'TypeError' 'UnboundLocalError' 'UnicodeDecodeError' 'UnicodeEncodeError' 'UnicodeError' 'UnicodeTranslateError' 'UnicodeWarning' 'UserWarning' 'ValueError' 'Warning' 'ZeroDivisionError' '__doc__' '__name__' '__package__' ]

7.3 异常处理

例如:打印一个没有定义的变量

1
2
3
4
>>>  print  a
Traceback (most recent call last):
   File  "<stdin>" , line  1 in  <module>
NameError: name  'a'  is  not  defined

会抛出异常,提示名字没有定义。如果程序遇到这种情况,就会终止。

那我们可以这样,当没有这个变量的时候就变量赋值,否则继续操作。

1
2
3
4
5
6
7
>>>  try :             
...    print  a
...  except  NameError:
...   a  =  ""
...
>>> a
''

这样就避免了异常的发生。在开发中往往不知道什么是什么异常类型,这时就可以使用Exception类型来捕捉所有的异常:

例如:打印一个类对象里面没有的属性

1
2
3
4
5
6
7
8
9
10
11
>>>  class  A:
...   a  =  1
...   b  =  2
...
>>> c  =  A()
>>>  try :
...    print  c.c
...  except  Exception:
...    print  "Error..."
...
Error...

有时也想把异常信息也打印出来,怎么做呢?

可以把错误输出保存到一个变量中,根据上面例子来:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>>  try :
...    print  c.c
...  except  Exception, e:
...    print  "Error: "  +  str (e)
...
Error: A instance has no attribute  'c'
# 也可以使用as关键字将错误出输出保存到变量中
>>>  try :               
...    print  c.c         
...  except  Exception as e:
...    print  "Error: "  +  str (e)         
...
Error: A instance has no attribute  'c'

当出现的异常类型有几种可能性时,可以写多个except:

1
2
3
4
5
6
7
8
>>>  try :
...    print  a
...  except  NameError, e:
...    print  "NameError: "  +  str (e)
...  except  KeyError, e:
...    print  "KeyError: "  +  str (e)
...
NameError: name  'a'  is  not  defined

注意:except也可以不指定异常类型,那么会忽略所有的异常类,这样做有风险的,它同样会捕捉Ctrl+C、sys.exit等的操作。所以使用except Exception更好些。

7.4 else和finally语句

7.4.1 else语句

表示如果try中的代码没有引发异常,则会执行else。

继续按照上面定义的类举例:

1
2
3
4
5
6
7
8
9
>>>  try :    
...    print  c.a
...  except  Exception as e:
...    print  e
...  else :
...    print  "else..."
...
1
else ...

7.4.2 finally语句

表示无论是否异常,都会执行finally。

1
2
3
4
5
6
7
8
9
>>>  try :    
...    print  c.c
...  except  Exception as e:
...    print  e
...  finally :
...    print  "finally..."
...
A instance has no attribute  'c'
finally ...

一般用于清理工作,比如打开一个文件,不管是否文件是否操作成功,都应该关闭文件。

7.4.3 try...except...else...finally

这是一个完整的语句,当一起使用时,使异常处理更加灵活。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/python    
# -*- coding: utf-8 -*-
try :
    print  a
except  Exception as e:
    print  "Error: "  +  str (e)
else :
    print  "else..."
finally
    print  "finally..."
         
# python test.py
python test.py
Error: name  'a'  is  not  defined
finally ...

需要注意的是:它们语句的顺序必须是try...except...else...finally,否则语法错误!里面else和finally是可选的。


博客地址:http://lizhenliang.blog.51cto.com

QQ群:Shell/Python运维开发群 323779636


7.5 自定义异常类

raise语句用来手动抛出一个异常,使用方法:

raise ExceptType(ExceptInfo)

例如:抛出一个指定的异常

1
2
3
4
>>>  raise  NameError( 'test except...' )
Traceback (most recent call last):
   File  "<stdin>" , line  1 in  <module>
NameError: test  except ...

raise参数必须是一个异常的实例或Exception子类。

上面用的Exception子类,那么我定义一个异常的实例,需要继承Exception类:

1
2
3
4
5
6
7
8
9
10
>>>  class  MyError(Exception):
...    def  __init__( self , value):
...       self .value  =  value
...    def  __str__( self ):
...       return  self .value
...
>>>  raise  MyError( "MyError..." )
Traceback (most recent call last):
   File  "<stdin>" , line  1 in  <module>
__main__.MyError: MyError...

7.6 assert语句

assert语句用于检查条件表达式是否为真,不为真则触发异常。又称断言语句。

一般用在某个条件为真才能正常工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>>  assert  1 = = 1
>>>  assert  1 ! = 1
Traceback (most recent call last):
   File  "<stdin>" , line  1 in  <module>
AssertionError
>>>  assert  range ( 4 ) = = [ 0 , 1 , 2
Traceback (most recent call last):
   File  "<stdin>" , line  1 in  <module>
AssertionError
# 添加异常描述信息
>>>  assert  1 ! = 1 "assert description..."
Traceback (most recent call last):
   File  "<stdin>" , line  1 in  <module>
AssertionError:  assert  description...



本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1861147,如需转载请自行联系原作者
相关文章
|
11月前
|
运维 监控 算法
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
MSET-SPRT是一种结合多元状态估计技术(MSET)与序贯概率比检验(SPRT)的混合框架,专为高维度、强关联数据流的异常检测设计。MSET通过历史数据建模估计系统预期状态,SPRT基于统计推断判定偏差显著性,二者协同实现精准高效的异常识别。本文以Python为例,展示其在模拟数据中的应用,证明其在工业监控、设备健康管理及网络安全等领域的可靠性与有效性。
1163 13
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
|
9月前
|
人工智能 C# Python
处理python异常
本文介绍了Python中的异常处理机制,并实现了一个简单的异常装饰器。通过`try/except`语句捕获异常,结合`finally`子句完成清理工作。为进一步优化代码结构,文章提出了使用装饰器处理异常的方法,避免函数中大量冗长的异常处理语句。通过类封装异常装饰器,多个函数可共享异常处理逻辑,提升代码简洁性和可维护性。总结强调了装饰器在异常处理中的优势,使代码更加优雅高效。
215 27
|
安全 Linux 网络安全
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(一)
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(一)
848 2
|
Python Windows 网络安全
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(二)
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(二)
265 2
|
11月前
|
数据采集 监控 Python
Python爬虫异常处理:自动跳过无效URL
Python爬虫异常处理:自动跳过无效URL
Python爬虫异常处理:自动跳过无效URL
|
10月前
|
Python
如何处理python的常见异常问题
在Python语言中,python异常处理机制主要依赖try、except、else、finally和raise五个关键字。本篇文章将为大家详细讲解一下如何处理python的常见异常问题。
|
人工智能 Shell 开发工具
[oeasy]python065python报错怎么办_try_试着来_except_发现异常
本文介绍了Python中处理异常的基本方法,重点讲解了`try`和`except`的用法。通过一个计算苹果重量的小程序示例,展示了如何捕获用户输入错误并进行处理。主要内容包括: 1. **回顾上次内容**:简要回顾了Shell环境、Python3游乐场和Vim编辑器的使用。 2. **编写程序**:编写了一个简单的程序来计算苹果的总重量,但发现由于输入类型问题导致结果错误。 3. **调试与修正**:通过调试发现输入函数返回的是字符串类型,需要将其转换为整数类型才能正确计算。
409 32
|
数据库 Python
[oeasy]python066_如何捕获多个异常_try_否则_else_exception
本文介绍了Python中`try...except...else`结构的使用方法。主要内容包括: 1. **回顾上次内容**:简要复习了`try`和`except`的基本用法,强调了异常处理的重要性。 2. **详细解释**: - `try`块用于尝试执行代码,一旦发现错误会立即终止并跳转到`except`块。 - `except`块用于捕获特定类型的异常,并进行相应的处理。 - `else`块在没有异常时执行,是可选的。 3. **示例代码**:通过具体例子展示了如何捕获不同类型的异常(如`ValueError`和`ZeroDivisionError`),并解释了异常处理
224 24
|
数据库连接 开发者 Python
Python中的异常处理
本文深入探讨了Python中的异常处理机制,包括异常的捕获、处理、抛出及最佳实践。通过try-except语句块,程序可以在运行时处理错误,增强健壮性和可维护性。文章还介绍了自定义异常类的创建与使用,并提供了代码示例和详细的语法说明。最后,总结了异常处理的最佳实践,如精确捕获异常、提供有用错误信息等,帮助开发者编写更可靠的代码。
406 14
|
12月前
|
人工智能 数据库 开发者
[oeasy]python068_异常处理之后做些什么_try语句的完全体_最终_finally
介绍了 Python 中 `try` 语句的完全体,包括 `try`、`except`、`else` 和 `finally` 子句的使用。通过实例展示了如何捕获异常并输出详细的错误信息,如文件名和行号。特别强调了 `finally` 子句的作用,无论是否发生异常,`finally` 都会执行,常用于清理操作。最后总结了 `try` 语句的四个部分及其应用场景,并简要提及了 Python 社区的决策机制。 #try #except #else #finally
218 1

推荐镜像

更多