2015-01-12 67 views
8

如果我理解正確,當我運行Python程序時,Python解釋器會生成字節碼(該.pyc文件出現在.py源旁邊),除非源包含語法錯誤。Python異常(除了SyntaxError)運行時錯誤?

當執行.pyc代碼時,字節碼編譯器是否會生成任何其他異常或是運行時引發的所有其他異常?

+2

還有'IndentationError',但這可能是一個微不足道的問題(因爲它也是一種語法錯誤)。 –

+0

Python 2.7內置異常的整個列表是[here](https://docs.python.org/2/library/exceptions。HTML#異常層次結構)。還有我忘記的TabError。我相信其餘的是運行時錯誤,但有一些模糊的,我不完全確定他們可以觸發的所有方式。如果我錯了,我會讓更多有關Python的更多知識的人瞭解我。 –

+1

請注意,'SyntaxError' _can_等錯誤在運行時也會引發。例如例如'ast.parse'可以引發'SyntaxError'。 – mgilson

回答

4

那麼,任何異常類型可以在技術上在運行期間通過raise <exception>引發。但是我認爲你理解這一點,並且詢問在Python解釋你的代碼時(在執行之前)可能會產生什麼異常。實際上有很多:

  • SyntaxError:這是解析器在讀取代碼時引發的。它來自無效語法,如不平衡括號,在錯誤位置使用關鍵字等。

  • IndentationError:這是SyntaxError的子類,只要代碼縮進不正確,就會引發此問題。一個例子是:

    if condition: 
        line_indented_4_spaces 
        line_indented_3_spaces 
    
  • TabError:這是IndentationError一個子類,當你不一致的源文件混合製表符和空格提高。

  • SystemError:當內部操作失敗時,由解釋器引發。遇到這種情況通常意味着你的Python安裝已經搞亂了,可能需要重新安裝。

  • MemoryError:這與SystemError類似,當內部操作因缺少內存而失敗時可以引發。

所有這些異常都可以在代碼開始執行之前提出。前三個是由損壞的源文件引起的,可以通過簡單地修復語法或縮進來解決。然而,後兩者是由解釋者自己提出的失敗的內部操作。這意味着它們很少見,但它們更嚴重,不易修復。

+0

''MemoryError'也可以在運行時引發,即使沒有用'ast'做出有趣的事情,或者明確地提出它或任何其他漏洞 - 如果你嘗試創建一個對你的系統內存來說太大的'list' , 例如。 –

1

當您使用Python代碼時,通常沒有編譯步驟,所以我會爭辯說Python中包含SyntaxErrors的所有錯誤都是運行時錯誤。

例如,讓我們寫這個文件:

in xrange(5): 

這顯然只是無稽之談(我們甚至會命名爲nonsense.py),但讓火了解釋:

$ python 
>>> try: 
...  import nonsense 
... except SyntaxError: 
...  print("A syntax error occurred at runtime!") 
... 
A syntax error occurred at runtime! 
>>> 

所以你有它 - 一個SyntaxError被引發並在運行時被捕獲,至少在我看來,它表明這是一個運行時錯誤。

+0

這是可行的,因爲您正在*導入*模塊,這是在運行時完成的。您無法在直接運行的文件中捕捉到「SyntaxError」。另外,你不能捕獲由受損的Python安裝引發的'SystemError'。在我的答案中列出的例外都可以在代碼開始執行之前(運行時之前)提出。 – iCodez

+0

準確。將您的try/except塊移入nonsense.py,然後從命令行執行'python。/ nonsense.py'。即使你用try包裝...除了SyntaxError,它也不會被捕獲。 –