2011-11-01 129 views
5

當調用GetLastError時,某些Windows函數(如CreateFile)可能會返回巨大的各種錯誤代碼,並且檢查每個可能的錯誤代碼都是不切實際的 - 通常沒有足夠的文檔,並且經常添加新的錯誤代碼。我應該處理哪些錯誤?哪些是「致命的」?

其中一些(如訪問衝突或無效參數)是由程序員錯誤引起的,不應允許繼續執行程序。然而,其他因素則是由於其他因素造成的,例如文件許可權不良,共享違規,文件名錯誤等,開發人員很少或根本無法控制。

我想處理所有「非關鍵」錯誤(如錯誤的文件名),同時允許「嚴重錯誤」(例如訪問違規)使我的程序崩潰。

理想情況下,我會說:

// ... an error occurred. Is it a programmer error? 

if (IsErrorCritical(GetLastError())) 
{ 
    // Yes; raise an exception, crashing the program. 
    RaiseException(GetLastError(), 0, 0, NULL); 
} 

如何決定哪些錯誤代碼是安全的壓制(例如,磁盤上的枚舉文件時),當我不可能預測每個結果?

+2

我會爭辯說,一個程序不應該崩潰,除非在真正的特殊情況下(訪問衝突等)。未能創建文件應該是預期的失敗,並以優雅的方式處理。此外,只要添加一些新的錯誤代碼,您的IsErrorCritical()函數就會過時。 – Luke

+0

對,但我怎麼知道某件事情是否「真正例外」?這就是問題。 – Mehrdad

+0

當我說非凡時,我的意思就是那個。訪問違規和內存不足是兩大問題;可能有其他人,但你明白了。如果CreateFile()失敗導致你的程序崩潰,那麼你做錯了恕我直言。 – Luke

回答

3

我認爲這實際上取決於上下文,不可能一般來決定這個,而是需要根據具體情況來決定。

我這樣說的原因是,有時相同的錯誤代碼出現在不同的上下文中,所以它不是錯誤代碼本身,可以用來確定它是否是關鍵但是上下文本身。

4

「關鍵」取決於您對文件所做的操作。

任何錯誤代碼可能是因爲程序員錯誤,或在運行的機器上的一些特殊的事情;我不認爲這是錯誤處理的重要區別。

對於你沒有專門處理的錯誤(「未知」錯誤),假設文件沒有被創建,並處理該情況。這並不重要,爲什麼它沒有創建,只是假設它不是,並說明了這種情況。根據你的代碼在做什麼以及你想在這個場景中付出多少努力,它可能是致命的或者不是。

請注意,訪問違規不是GetLastError()知道的事情,所以我不明白它與您的問題的相關性。

+0

實際上,我*從GetLastError獲得訪問違規。當然不是用'CreateFile',而是用其他函數(不幸的是我不記得哪一個)。不過好點,+1。 – Mehrdad

+0

「從getlasterror獲取訪問違規」意味着什麼? – tenfour

+0

這意味着我收到了從GetLastError返回的'ERROR_NOACCESS',但我不記得我得到了什麼功能。 – Mehrdad