保留異常來源信息
在C++中,無論何時在處理程序內(nèi)捕獲一個異常,關(guān)于該異常來源的信息都是不為人知的。異常的具體來源可以提供許多更好地處理該異常的重要信息,或者提供一些可以附加到錯誤日志的信息,以便以后進(jìn)行分析。
為了解決這一問題,可以在拋出異常語句期間,在異常對象的構(gòu)造函數(shù)中生成一個堆棧跟蹤。ExceptionTracer是示范這種行為的一個類。
清單 1. 在異常對象構(gòu)造函數(shù)中生成一個堆棧跟蹤
// Sample Program:
// Compiler: gcc 3.2.3 20030502
// Linux: Red Hat
#include
#include
#include
#include
using namespace std;
/////////////////////////////////////////////
class ExceptionTracer
{
public:
ExceptionTracer()
{
void * array[25];
int nSize = backtrace(array, 25);
char ** symbols = backtrace_symbols(array, nSize);
for (int i = 0; i < nSize; i++)
{
cout << symbols[i] << endl;
}
free(symbols);
}
};
管理信號
每當(dāng)進(jìn)程執(zhí)行一個令人討厭的動作,以致于Linux?內(nèi)核發(fā)出一個信號時,該信號都必須被處理。信號處理程序通常會釋放一些重要資源并終止應(yīng)用程序。在這種情況下,堆棧上的所有對象實例都處于未破壞狀態(tài)。另一方面,如果這些信號被轉(zhuǎn)換成 C++ 異常,那么您可以優(yōu)雅地調(diào)用其構(gòu)造函數(shù),并安排多層 catch 塊,以便更好地處理這些信號。
清單2中定義的SignalExceptionClass,提供了表示內(nèi)核可能發(fā)出信號的C++異常的抽象。SignalTranslator 是一個基于 SignalExceptionClass 的模板類,它通常用來實現(xiàn)到 C++異常的轉(zhuǎn)換。在任何瞬間,只能有一個信號處理程序處理一個活動進(jìn)程的一個信號。因此,SignalTranslator 采用了 singleton 設(shè)計模式。整體概念通過用于 SIGSEGV 的 SegmentationFault 類和用于 SIGFPE 的 FloatingPointException 類得到了展示。
在C++中,無論何時在處理程序內(nèi)捕獲一個異常,關(guān)于該異常來源的信息都是不為人知的。異常的具體來源可以提供許多更好地處理該異常的重要信息,或者提供一些可以附加到錯誤日志的信息,以便以后進(jìn)行分析。
為了解決這一問題,可以在拋出異常語句期間,在異常對象的構(gòu)造函數(shù)中生成一個堆棧跟蹤。ExceptionTracer是示范這種行為的一個類。
清單 1. 在異常對象構(gòu)造函數(shù)中生成一個堆棧跟蹤
// Sample Program:
// Compiler: gcc 3.2.3 20030502
// Linux: Red Hat
#include
#include
#include
#include
using namespace std;
/////////////////////////////////////////////
class ExceptionTracer
{
public:
ExceptionTracer()
{
void * array[25];
int nSize = backtrace(array, 25);
char ** symbols = backtrace_symbols(array, nSize);
for (int i = 0; i < nSize; i++)
{
cout << symbols[i] << endl;
}
free(symbols);
}
};
管理信號
每當(dāng)進(jìn)程執(zhí)行一個令人討厭的動作,以致于Linux?內(nèi)核發(fā)出一個信號時,該信號都必須被處理。信號處理程序通常會釋放一些重要資源并終止應(yīng)用程序。在這種情況下,堆棧上的所有對象實例都處于未破壞狀態(tài)。另一方面,如果這些信號被轉(zhuǎn)換成 C++ 異常,那么您可以優(yōu)雅地調(diào)用其構(gòu)造函數(shù),并安排多層 catch 塊,以便更好地處理這些信號。
清單2中定義的SignalExceptionClass,提供了表示內(nèi)核可能發(fā)出信號的C++異常的抽象。SignalTranslator 是一個基于 SignalExceptionClass 的模板類,它通常用來實現(xiàn)到 C++異常的轉(zhuǎn)換。在任何瞬間,只能有一個信號處理程序處理一個活動進(jìn)程的一個信號。因此,SignalTranslator 采用了 singleton 設(shè)計模式。整體概念通過用于 SIGSEGV 的 SegmentationFault 類和用于 SIGFPE 的 FloatingPointException 類得到了展示。

