2013-07-23 18 views
1

我知道可以使用try ... except語句來忽略Python中的異常。是否有可能在發生Python時忽略異常,但是仍然會打印它們?在Python中,是否可以打印異常,即使它們被忽略?

我想在這裏忽略了異常,因此,當它遇到不打印例外:

try: 
    num = 0 
    if num == 0: 
     raise Exception("Num must not be 0!") 
except Exception: 
    pass 
    '''The exception is ignored, and is not printed.''' 

我寫了一個簡單的源到源編譯器,它有很多類似的異常這些,我不知道我怎麼可以在打印它們時忽略這些異常。我如何確保將異常打印到控制檯,即使它們被忽略?

回答

7

您可以打印像這樣的異常。

try: 
    x = 1/0 
except Exception as e: 
    print e 

編輯:

由於user1354557,gcbirzan,和喬納森Vanasco指出的那樣,你可以使用tracebacklogging模塊,以獲得更精確的錯誤消息。以這些方式打印出來的錯誤信息將會更加冗長,這通常是一件好事。

import traceback 

try: 
    x = 1/0 
except Exception as e: 
    print traceback.format_exc() # I prefer this to traceback.print_exc() 


import logging 

try: 
    x = 1/0 
except Exception as e: 
    logging.exception(e) 
+1

你可能會使用'traceback'的其他答案更好。 'print e'將只打印e - 這通常意味着調用'ValueError'的字符串「message」。與追溯。print_exc()',你會得到異常的模塊+行號和異常的實際類型。 –

6

如果你想堆棧跟蹤的打印輸出,你可以使用traceback模塊:

import traceback 
try: 
    0/0 
except: 
    traceback.print_exc() 

這將打印出類似這樣:

Traceback (most recent call last): 
    File "example.py", line 3, in <module> 
    0/0 
ZeroDivisionError: integer division or modulo by zero 

這是你在做什麼尋找?

+2

+1不知道爲什麼有人-1'd你 –

4

你應該看看日誌記錄模塊。它支持使用traceback記錄異常(通過logger.exception或將exc_info作爲關鍵字參數傳遞給任何日誌記錄功能)。

1

通過忽略,我想你的意思是你想要打印它,但不能抓住它,並讓它冒出調用堆棧。你可以通過捕獲異常,打印它,然後重新拋出異常來做到這一點。

try : 
    # do something 
except Exception as e: 
    print e 
    raise e 
+0

不知道爲什麼downvote - 再次提高例外是非常有用的。 – 2rs2ts

+1

只需要單獨輸入'raise'就可以重新產生異常(雖然我不是downvoter)。 – Paolo

+0

它不僅可能,而且更喜歡使用'raise'來重新引發異常。 – kindall

0

即使在沒有使用跟蹤函數編寫的代碼(例如庫模塊)中,也可以全局執行此操作。

import sys 

def print_exceptions(frame, event, arg): 
    if event == "exception": 
     sys.excepthook(*arg) 
    return print_exceptions 

sys.settrace(print_exceptions) 

請注意,trace函數在執行時執行的每個語句都會調用,因此可能會顯着減慢腳本的執行速度。另一個小問題是任何未處理的異常將被打印兩次(一次由該鉤子,在退出腳本時由Python本身再次)。

如果要定製輸出,可以挖你想出來的arg的信息(它是異常類型的一個3元組,該錯誤消息,和一個回溯對象)和frame(其包括與參考當前的代碼對象,從中可以獲取其名稱,以及源文件名和行號)。

相關問題