2016-04-20 28 views
1

我不想做的所有異常:獲取,可能導致從int(some_variable)

try: 
    pid = int(a_variable) 
except StandardError as e: 
    pass 

所以,問題是什麼是搞清楚所有可能的異常的方法可能導致int(a_variable)。很明顯,TypeErrorValueError可以發生,但我怎麼工作出什麼可以結果?

+0

@falsetru看到更新的最後一句,對不起 – LetMeSOThat4U

+0

你想知道一切,可以發生或如何處理其他異常不是'TypeError'和'ValueError'可能的例外? – Aurel

+1

你會如何處理TypeError? 'sys.argv'被定義爲字符串列表,並且字符串轉換爲int時不會引發TypeErrors。 –

回答

3

您可以選擇適合您traceback模塊的方法,並用日誌對象結合起來(見logging模塊):

import traceback 
import sys 
import logging 
try: 
    pid = int(sys.argv[1]) 
except Exception as e: 
    logging.error(traceback.print_exc()) 

執行的例子:

你能趕上一個IndexError異常與python begueradj.py

[email protected]:~/Desktop$ python begueradj.py 
Traceback (most recent call last): 
    File "tester.py", line 6, in <module> 
    pid = int(sys.argv[1]) 
IndexError: list index out of range 

您可以捕獲ValueError例外情況^ h python begueradj.py +

[email protected]:~/Desktop$ python begueradj.py + 
Traceback (most recent call last): 
    File "tester.py", line 6, in <module> 
    pid = int(sys.argv[1]) 
ValueError: invalid literal for int() with base 10: '+' 
+1

我認爲這個答案實際上是回答提出的問題。 – user3610360

1

我只看到,可以通過代碼會產生兩種可能的異常:

pid = int(sys.argv[1]) 
  • ValueError如果sys.argv[1]字符串是沒有有效的整數表示(如「1」或「1.5」)
  • IndexError如果sys.argv列表不包含至少兩個元素,因爲腳本是在沒有命令行參數的情況下執行的。

有沒有機會(假設你不重寫建宏)你的代碼可以提高一個TypeError,因爲sys.argv始終是一個字符串列表。期。

你可能最終也連得NameError如果你忘了在你的代碼上面這一行,以及在import sys,但沒有運行時錯誤,但一個編程錯誤。


什麼可能發生的是因爲用戶在準確毫秒按下按Ctrl + Ç,而你的命令運行解釋提出了一個不相關的異常像KeyboardInterrupt - 但通常不想在當地捕到那些人。


正如您在您的評論是說,在你的問題的代碼行只是一個例子,如果我們推廣這int(x)(與x是文字或變量,但沒有什麼是能夠引發例外本身,像方法調用或操作),你還可以得到這些異常:

  • TypeError如果參數既不是數字類型(整型,長整型,浮點,複雜的,布爾),也不是一個字符串類型(str,bytes,bytearray)或其他任何對象g __int__方法或(自3.4)__index__方法。

  • NameError如果您使用變量名作爲輸入,但尚未在此上下文中定義輸入。但是,除非您使用evalexec,並且讓用戶輸入變量名稱(不鼓勵!),否則這種情況不太可能發生。由於這是一個純粹的編程錯誤,並且沒有運行時錯誤,並且您的IDE將突出顯示未聲明的變量名稱的使用,所以檢查此錯誤通常無用。

+1

最好的答案比我的,但你忘記了第一種情況下1 /'AttributeError'的可能情況(如果'SYS'綁定到沒有'ARGV'屬性的東西],並且2 /只是任何可能的內建或自定義異常,如果'x'具有'__int __(self)'的破壞實現 - 但都屬於「編程錯誤」類別,就我而言,我們不希望發現編程錯誤無論如何。 –