2010-10-10 44 views
0

注意:限制是我不能使用異常(代碼最終編譯時禁用了例外 - 不受我控制)。該項目是一個實時3D圖形應用程序。如何在錯誤檢查期間減少冗餘代碼

我正在使用我自己的錯誤類(我發佈了一個關於這個不太久的問題),每個類都使用它。非常簡單,它只是在函數調用期間記錄錯誤。該函數返回該錯誤,也可以通過調用SomeClass->GetLastError()來檢查該錯誤。如果是NO_ERROR(所有枚舉),那麼我們可以繼續,雖然我們可以選擇忽略它(例如,如果一個特定的對象沒有加載,我們可以忽略它,把一個醜陋的粉紅色框放在它的位置並標記錯誤)。在創建State時調用功能CreateScene(),然後繼續調用負責創建場景的各種功能。所有這些函數都可能會返回錯誤。那麼,那麼我是這樣的:

if (CreateGrid() != NO_ERROR) 
{ 
    mCore->Terimate(); 
    mLog->Error("\n[FATAL] Initialization Failed, check error log"); 
    return; 
} 
if (SomeOtherFunc() != NO_ERROR) 
{ 
    mCore->Terimate(); 
    mLog->Error("\n[FATAL] Initialization Failed, check error log"); 
    return; 
} 

稱爲可能有不同的函數簽名的功能,所以參數可以是不同的,雖然返回類型始終是一個整數。我有幾個像上面這樣的調用,所以我爲它寫了一個#define,它接受函數作爲參數,並且與上面的代碼完全相同。所以現在,上面的代碼看起來像:

CALL_FUNC(CreateGrid()); 
CALL_FUNC(SomeOtherFunc()); 

一旦我完成了定義,就是undefined。無論如何,這是我能想出的唯一想法。儘管它有一個醜陋#define生成的代碼是乾淨的。我應該在這裏使用更好的技術嗎?

感謝

+0

我覺得這個堆棧交換[建議](http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2「代碼審查」)可能是你的興趣。如果是顯示你的支持,並幫助它進入測試版:) – greatwolf 2011-01-16 05:17:34

回答

2

假設你真的不在乎哪個功能出現故障或可確定哪一個比測試返回值一些其他手段失敗,

if (CreateGrid() != NO_ERROR || SomeOtherFunc() != NO_ERROR) 
{ 
    // Handle error 
} 
+0

Bah!簡直不敢相信解決方案!我經常傾向於使簡單的事情過度複雜化。謝謝! – Samaursa 2010-10-10 02:41:33

+0

雙重答覆道歉,但有一件事引起了我的注意。儘管在這種情況下你的解決方案是完美的,但是如果我關心哪個函數失敗(例如輸出失敗的函數的名稱),或者每次都必須調用' - > GetLastError()',該怎麼辦? – Samaursa 2010-10-10 02:45:59

+1

您可以將錯誤處理代碼分解爲單獨的函數,併爲每個錯誤調用它,並將它傳遞給它所需的信息。 – 2010-10-10 02:50:26

2

正確答案是「使用異常」但這聽起來像是你無法控制的原因阻止你使用理想的解決方案。這是我的另一種選擇:考慮goto - 被認爲是有害的,但完全合法的C型錯誤檢查。下面是一個例子,請注意,所有的錯誤處理都在一個地方,並且您知道錯誤處理程序中的錯誤代碼,這會爲您帶來一些例外的優點,而無需實際使用例外。

int ret; 

if ((ret = CreateGrid()) != NO_ERROR) 
    goto Error; 

if ((ret = SomeOtherFunc()) != NO_ERROR) 
    goto Error; 

// ... 

Error: 
mCore->Terminate(); 
mLog->Error("\n[FATAL] Initialization Failed, check error log"); 
// Note that here, 'ret' stores the value of the last error code. 
// This may be useful for further diagnostics at this point, and you 
// probably want to log it too. 
return; 
+0

偉大的解決方案! goto的一個少見但正確的用途之一。我選擇詹姆斯作爲正確的答案,但這種解決方案將爲我提供另一種選擇。謝謝! – Samaursa 2010-10-10 03:58:01