1. 程式人生 > >python筆記--異常處理

python筆記--異常處理

python、異常處理

異常處理

異常就是程序出現錯誤無法正常工作了,異常處理是通過一些方法對出現的錯誤進行捕捉,友好地顯示出來或進行相應的處理,使得程序能夠更長時間運行。

1.異常種類

常見的:

SyntaxError 語法錯誤

IndentationError 縮進錯誤

TypeError 對象類型與要求不符合

ImportError 模塊或包導入錯誤;一般路徑或名稱錯誤

KeyError 字典裏面不存在的鍵

NameError 變量不存在

IndexError 下標超出序列範圍

IOError 輸入

/輸出異常;一般是無法打開文件

AttributeError 對象裏沒有屬性

KeyboardInterrupt 鍵盤接受到 Ctrl+C

Exception 通用的異常類型;一般會捕捉所有異常

查看所有的異常種類:

>>> 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‘, ‘WindowsError‘, ‘ZeroDivisionError‘, ‘__doc__‘, ‘__name__‘, ‘__package__‘]

2.捕捉異常語法

try:
pass                 #被檢查的語句
except except type,e:    #except type表示要捕捉的異常種類,e是一個變量,保存了異常信息。
pass                 #”,e”可以寫成”as e”

例如:

>>> try:
print a    #a是一個未定義的變量,直接執行”print a”會報NameError異常
except NameError,e:
print "Error:",e
 

Error: name ‘a‘ is not defined

註意:

如果異常可能會出現多個種類,可以寫多個except。例如:

>>> a = ‘hello‘
>>> try:
    int(a)
except IndexError,e:
    print e
except KeyError,e:
    print e
except ValueError,e:
print e

如果不知道會出現什麽異常,可以使用Exception捕獲任意異常,例如:

>>> a=‘hello‘
>>> try:
    int(a)
except Exception,e:
    print e

如果未捕獲到異常即異常種類不匹配,程序直接報錯,例如:

>>> a=‘hello‘
>>> try:
b=int(a)
except IndexError,e:
print e
 

 
Traceback (most recent call last):
  File "<pyshell#27>", line 2, in <module>
    b=int(a)
ValueError: invalid literal for int() with base 10: ‘hello‘

捕捉異常的其他結構:

#else語句

try:
    pass    #主代碼塊
except KeyError,e:
    pass
else:
    pass    # 主代碼塊執行完沒有異常,執行該塊。

#finally語句

try:
    pass    #主代碼塊
except KeyError,e:
    pass
finally:
    pass    # 無論異常與否,最終都執行該塊。

#try/except/else/finally組合語句,需要註意的是elsefinally都要放在except之後,而finally要放在最後。

try:
    pass
except KeyError,e:
    pass
else:
    pass
finally:
    pass

4. 主動觸發異常

raise可以主動拋出一個異常,例如:

>>> raise NameError(‘this is an NameError‘)
 
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    raise NameError(‘this is an NameError‘)
NameError: this is an NameError

#捕捉主動觸發的異常

>>> try:
    raise Exception(‘error!!!‘)
except Exception,e:
    print e
 

error!!!

5.自定義異常

>>> class MyException(Exception):    #繼承Exception類
    def __init__(self,msg):          #使用Exception類的__init__方法
        self.message=msg             #添加一個"message"屬性,用於存放錯誤信息
    def __str__(self):
        return self.message
 

>>> try:
    raise MyException("myerror!")    #主動引發自定義異常
except MyException,e:    
    print e
 

myerror!

6.斷言語句assert

assert用於判斷條件判斷語句是否為真,不為真則處罰異常,例如:

>>> assert 2>1
>>> assert 2<1


Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    assert 2<1
AssertionError

#添加異常描述信息:

>>> assert 2<1,"flase"
 
Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    assert 2<1,"flase"
AssertionError: flase

本文出自 “網絡技術” 博客,請務必保留此出處http://fengjicheng.blog.51cto.com/11891287/1929107

python筆記--異常處理