2014-01-08 25 views
1

我有這樣的代碼運行代碼:如何,即使發生異常

try 
{ 
    do_some_processing(); 
    // Write Log to appropriate place. 
} 
catch 
{ 
// add debug info to log 
// Write Log to appropriate place. 
    processException(); 
} 

正如你可以看到我需要寫日誌時,有一個例外,當沒有。

有什麼辦法可以在一個地方做?而不是複製兩次?

據我所知,最終在異常處理之後調用,而不是在它之前調用。我對嗎?

+2

沒有最後在C++。 – ScarletAmaranth

+3

你的日誌「有一個例外」和「一切都很好」會有所不同=>你不重複自己。 (或者我沒有得到什麼) – DrakaSAN

回答

4

我會用成語RAII

class RaiiLogger { 
public: 
    RaiiLogger() : exception_fired_(true) {} 

    void set_success() { 
     exception_fired_ = false; 
    } 

    ~RaiiLogger() { 
     if (exception_fired_) { 
      // log it 
     } else { 
      // log it 
     } 
    } 
private: 
    bool exception_fired_; 
}; 

void do_work() { 
    RaiiLogger logger; 
    try { 
     // do some work 
     logger.set_success(); 
    } catch(...) { 
     // handle exception 
    } 
} 

int main() { 
    // your code goes here 
    do_work(); 
    return 0; 
} 
+0

這是不正確的。如果do_som_work中存在異常,logger.set_success永遠不會被調用,因此不會寫入日誌!我錯了嗎? – mans

+0

@mans你錯了。由於'logger'被分配在堆棧上(而不是heap,因爲沒有使用'new'關鍵字),無論你做什麼'RaiiLogger'類的析構函數都會在函數離開它的作用域時被調用(即使異常是拋出)。這是RAII的精髓。請注意,'set_success'只會通知'logger'它已成功。 **該函數不記錄任何內容** - 析構函數處理它。 – freakish

3

只需將它的try-catch塊外:

try 
{ 
    do_some_processing(); 
} 
catch 
{ 
    // add debug info to log 
    processException(); 
} 

// Write Log to appropriate place. 
+1

啊,打了30秒... – RedX

+0

但如果procesException關閉應用程序,沒有寫入日誌!我錯了嗎? – mans

+0

@mans,它在哪裏拋出,爲什麼一個異常應該關閉程序? – Shoe

1

如何:

try{ 
    do_some_processing(); 
}catch{ 
    // add debug info to log 
    processException(); 
} 

// write log to appropriate place