1. 程式人生 > >Python學習筆記之異常處理

Python學習筆記之異常處理

一、異常的語法

       python的異常處理語法比較靈活,具有多種,掌握python異常處理的語法的關鍵是要明白,異常語法中的每個關鍵字的不同含義。只要我們明白關鍵字的含義,那麼語法也只是一種組合而已。

try:
    f = open('/etc/passwd')
    print(f1)
    f.read()
except OSError as err:
     print("OS error: {0}".format(err))
except  Exception as err:
    print(err)
else:
    print("all success")
finally:
    f.close()
print(f.closed)

輸出:

name 'f1' is not defined
True

       在上面一段程式碼中我們有try except else finally 四個主要的關鍵字,我們先介紹try,try是告訴python直譯器我下面的這些程式碼可能會出錯,我需要異常處理,在我出錯的時候將錯誤丟擲。

       except關鍵字後面接的是改段程式處理的異常型別,如果try語句塊丟擲的異常的型別是except可可接收的異常型別相同,那麼except語句塊就可以執行,如果不是就可以判斷下一個except語句塊。

       else 關鍵字裡面的語句,是所有的except語句塊條件不滿足,最後被執行的,也就是說我們的try語句塊丟擲了一個我們寫的except語句塊未檢測到的異常型別。如果else語句之前的except語句塊被執行了,那麼else語句塊就不會被執行。

       finally是指在try語句塊丟擲異常之後,不論我們的except語句塊,else語句塊被執行與否,finally語句塊都會被執行。

  二、異常的型別

        在python中我們的每一個異常型別都是一個類,我們在官網找到了所有異常類的繼承關係樹如下:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      |    +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning

      從上面的樹形圖我們可以看到,BaseException類是所有的異常類的基類。如果罵我們想要捕捉所有的系統自定義的異常型別,我們就可以使用 except BaseException:語句去實現。

      下面一是一些官網的異常示例程式碼

try:
    file_it = open('/etc/group','r')
    print(file_it.read())
except Exception as e:
    print(e)
#如果沒有異常,則執行else 程式碼
else:
    print('all success')
#不論是否有異常被丟擲,finally的程式碼都會被執行
finally:
    file_it.close()
while True:
    try:
        x = int(input('Please enter a number:'))
    except ValueError:
        print('Oops! That was no valid number')

import  sys
try:
    file_it = open('/tmp/passwd')
    s = file_it.readline()
    i = int(s.strip())
    print(a)
except OSError as err:
    print('OS error:{0}'.format(err))
except ValueError:
    print('Could not convert data to integer.')

except:
    print('Unexpected error:',sys.exc_info()[1])

else:
    print('all ok')
  三、自定義異常型別

        如果我們需要丟擲一個自己定義的異常,那麼需要們定義一個繼承於Exception的類如下面程式碼

class Error_Test(Exception):
    pass
try:
    print('all is well')
    raise Error_Test('all is well')    #Error_Test 類雖然沒有建構函式,但是他的父類有
except Error_Test as err:
    print(err)
finally:
    print('ok')
        raise 關鍵字用於程式設計師主動丟擲異常,而不是在編譯器報錯的時候自動丟擲異常,因此使用raise的try語句塊丟擲異常後,該語句塊不一定有錯誤。