2010-09-03 91 views
3

我在Python中遇到了一個非常奇怪的行爲,這種行爲並不一致。爲什麼我在Python上得到不一致的異常?

... 
except IOError as msg: 
    sys.exit("###ERROR IOError: %s" % (msg)) 

通常這會得到我的消息,如:

###ERROR IOError: [Errno 13] Permission denied: 'filename' 

在相同的情況下,上面的代碼是給我一個tuple,而不是正確的錯誤信息。

###ERROR IOError: (13, 'Permission denied') 

這是很奇怪的,因爲在所有情況下的例外來自同一蟒蛇方法,codecs.open(...)

什麼讓我不知道更多關於此的是,如果我刪除處理異常將達到與上水平正確的文本(完整的錯誤信息),永遠!

except IOError as msg: 
    print(msg) 
    raise msg 

上例將總是打印一個完整的消息,如IOError: [Errno 13] Permission denied: u'filename'

爲什麼會發生這種情況,如何防止這種情況發生,我不想給用戶提供不完整的錯誤消息。

我想在測試文件中重現此行爲,但我無法在項目外重現此操作。

我懷疑這跟sys.exit()的用法有關,因爲print(msg)會給出好的結果,但是sys.exit不會。

回答

5

首先,在重新規定例外時,從不except Exc as e: raise e。這是總是只是簡單的raise沒有參數。這將保留追溯。

不,這與sys.exit以及與異常如何實例化有關。你總是得到一個異常;有時它的字符串表示將類似於tuple的字符串表示。

>>> print IOError(13, 'Permission denied') 
[Errno 13] Permission denied 
>>> print IOError((13, 'Permission denied')) 
(13, 'Permission denied') 

沒有顯示完整的回溯,也沒有辦法確定究竟是以什麼方式提高了錯誤。另外,如果沒有像我指出的那樣進行適當的重新渲染,您將無法獲得完整的追溯。

1

在Python 1.5異常之前是字符串。之後,他們將其更改爲類以保持向後兼容性。現在你只能引發異常實例或類。

我想象有這樣的代碼:

error = (13, 'Permision denied') 

#more code 

raise error 

他們改成了異常某人後只是做:

raise IOError(error) 
0

我建議你不要依賴於字符串表示的例外;你可以將它命名爲msg,但它既不是字符串也不是消息;這是一個例外情況。

所以你可能想從msg.args元組構造出你自己的字符串,並用它作爲你想要顯示的「消息」。

相關問題