2015-04-30 20 views
2

1.)什麼樣的異常日誌記錄是更好的做法?正在登錄異常構造函數的不良做法?

  //1 xor //2 

2.)這個問題語言是否特定? (最感興趣的是C++)

要的代碼:

:: LOG是宏單記錄器

struct myExc : virtual std::runtime_error 
{ 
    myExc(std::string const&msg) 
    :runtime_error(msg) 
    { 
     LOG << msg; //1 
    } 
}; 

void foo_throw() 
{ 
    throw myExc(""); 
} 


/// some_where 
... 
try() 
{ 
    foo_throw(); 
} 
catch(myExc const& e) 
{ 
    LOG << e.what();  //2 
} 
catch(... 
+0

我更喜歡第二個變體。 –

+0

我通常不會這樣做。如果打印異常真的是處理異常的恰當方法,我*可能*使用第二種方法,但處理異常通常不止於此。 –

+0

第二次記錄更好.. – Kushal

回答

3

的第二變體是優選的,因爲一些代碼進一步調用堆棧向上可以選擇捕獲異常而不輸出錯誤。在第一個版本中,只要創建異常就會輸出,從而使捕獲代碼的選擇更少。

例如,你可能會做這樣的事情:

try 
{ 
    foo_throw(); 
} 
catch (myExc& e) 
{ 
    //do some recovery 
} 

如果你的異常構造函數輸出的東西,你不能說醒目異常的時候做任何事情。

0

第一個可能太「太聰明瞭」。你確定LOG <<不能拋出異常嗎?在第二種情況下,你有更多的信息和更多的可能性來考慮如果LOG <<拋出什麼發生,尤其是你可以在登錄之前做強制性安全的東西。

第一個案例試圖做兩件事:通知有關異常和日誌消息。這不好。在第二種情況下,你只告知異常,然後處理它:做東西和日誌。

第二種情況是責任分離的例子,其中一個班級完成一項任務。

另外你的異常類是免費的依賴logger這也是好東西。