首頁 後端開發 C#.Net教程 C++程式的例外處理技巧

C++程式的例外處理技巧

Dec 16, 2016 am 09:42 AM

處理 C++ 中的異常會在語言等級上碰到少許隱含限制,但在某些情況下,您可以繞過它們。學習各種利用異常的方法,您就可以生產更可靠的應用程式。 保留異常來源資訊 在C++中,無論何時在處理程序內捕捉一個異常,關於該異常來源的資訊都是不為人知的。異常的具體來源可以提供許多更好地處理該異常的重要信息,或者提供一些可以附加到錯誤日誌的信息,以便以後進行分析。 為了解決這個問題,可以在拋出異常語句期間,在異常物件的建構函式中產生一個堆疊追蹤。 ExceptionTracer是示範這種行為的一個類別。 清單1. 在異常物件建構子中產生一個堆疊追蹤// Sample PRogram:

// Compiler: gcc 3.2.3 20030502

// linux: Red Hat #include

// linux: Red Hat #include
.h> #include

#include using namespace std; /////////////////////////////// ////////////// class ExceptionTracer

{

public:

ExceptionTracer()

{

void * array[25];
{

void * array[25]; );

char ** symbols = backtrace_symbols(array, nSize);

 

for (int i = 0; i
} free(symbols);

}

}; 治理訊號 每當進程執行一個令人討厭的動作,以致於Linux? 核心發出一個訊號時,該訊號都必須被處理。訊號處理程序通常會釋放一些重要資源並終止應用程式。在這種情況下,堆疊上的所有物件實例都處於未破壞狀態。另一方面,假如這些訊號會轉換成C++ 異常,那麼您可以優雅地呼叫其建構函數,並安排多層 catch 區塊,以便更好地處理這些訊號。 清單 2 中定義的 SignalExceptionClass,提供了表示內核可能發出訊號的 C++ 異常的抽象。 SignalTranslator 是一個基於 SignalExceptionClass 的模板類,它通常用來實現到 C++ 異常的轉換。在任何瞬間,只能有一個訊號處理程序來處理一個活動進程的一個訊號。因此,SignalTranslator 採用了 singleton 設計模式。整體概念透過用於 SIGSEGV 的 SegmentationFault 類別和用於 SIGFPE 的FloatingPointException 類別得到了展示。 清單2. 將訊號轉換成異常



template class SignalTranslator

{

private:

classTonlator

private:

class {

signal(SignalExceptionClass ::GetSignalNumber(), 

SignalHandler);

} static void SignalHandler(int)

{

throw SignalExceptionClass();
{

static SingleTonTranslator s_objTranslator;

}

}; // An example for SIGSEGV

class SegmentationFault : public ExceptionTracer, public 
. ) {return SIGSEGV;}

} ; SignalTranslator 

g_objSegmentationFaultTranslator; // An example for SIGFPE

class FloatingPointException : public ExceptionTracer, public希
類alNumber() {return SIGFPE;}

}; SignalTranslator 

g_objFloatingPointExceptionTranslator;     治理建構子和斷層子構函中的異常 在全域(靜態全域)變數的建構和析構期間,每個ANSI C++ 都捕捉到異常是不可能的。因此,ANSI C++ 不建議在那些其實例可能被定義為全域實例(靜態全域實例)的類別的建構函式和析構函式中拋出例外狀況。換一種說法就是永遠不要為那些其建構子和析構函式可能拋出異常的類別定義全域(靜態全域)實例。不過,如果假定有一個特定編譯器和一個特定係統,那麼可能可以這樣做,幸運的是,對於Linux 上的 GCC,恰好是這種情況。 使用 ExceptionHandler 類別可以展示這一點,該類別也採用了 singleton 設計模式。其構造函數註冊了一個未捕捉的處理程序。因為每次只能有一個未捕捉的處理程序處理一個活動進程,構造函數應該只會被呼叫一次,因此要採用 singleton 模式。應該在定義有問題的實際全域(靜態全域)變數之前定義 ExceptionHandler 的全域(靜態全域)實例。 清單 3. 處理構造函數中的異常 class ExceptionHandler


{

private:

class SingleTonHandler

{

public:

SingleTonHandler()

{

set_terminate(Handler);

} static void Handler()

{

//全域變數建構/銷毀異常try

{

//重新拋出throw;

}

catch (Seg
}

catch (FloatingPointException &)

{

cout

cout

cout



cout
} //如果這是執行某些核心活動的執行緒

abort();

//否則如果這是一個用於服務請求的執行緒

// pthread_exit();

}
// pthread_exit();

}
//pthread_exit();

}

} ; public:

ExceptionHandler()

{

static STondler s_objdler s
/
{
/
static STondler s_obj; ////////////////////////////////////////////////// ///////////////////////////// ////////////////////// /// A類

{

public:

A()

{

//int i = 0, j = 1/i;

*(int *)0 = 0;0;
}; // 在定義任何全域變數之前,我們定義一個ExceptionHandler 物件的虛擬實例

// 以確保

// ExceptionHandler::SingleTonHandler::SingleHandler() 被Ton chhahadleraException ; ///////////////////////////////////////////////// ///////////////////////////////////////////////// //////////////// int main(int argc, char* argv[])

{

return 0;

}     處理多執行緒程式中的異常有時有些異常被捕獲,這將造成進程異常中止。不過很多時候,進程包含多個線程,其中少數線程執行核心應用程式邏輯,同時,其餘線程為外部請求提供服務。 假設服務執行緒由於程式錯誤而沒有處理某些異常,導致整個應用程式崩潰。這一點可能是不受好評的,因為它會透過向應用程式傳送不合法的請求而助長拒絕服務攻擊。為了避免這一點,未捕獲處理程序可以決定是請求異常中止調用,還是請求線程退出調用。清單3中ExceptionHandler::SingleTonHandler::Handler()函式的呼叫處展示了此處理程序。結論我簡單地討論了一些C++程式設計模式,以便更好地執行以下任務: ·在發送異常的時候追蹤異常的來源。

·將訊號從核心程式轉換成C++異常。

·捕捉構造和/或分析架構全域變數觸發期間出的異常。

·多執行緒進程中的異常處理。

以上就是C++程式的異常處理技巧的內容,更多相關文章請關注PHP中文網(www.php.cn)!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1268
29
C# 教程
1248
24
C++ 函式異常與多執行緒:並發環境下的錯誤處理 C++ 函式異常與多執行緒:並發環境下的錯誤處理 May 04, 2024 pm 04:42 PM

C++中函數異常處理對於多執行緒環境特別重要,以確保執行緒安全性和資料完整性。透過try-catch語句,可以在出現異常時擷取和處理特定類型的異常,以防止程式崩潰或資料損壞。

C++ 異常處理如何支援自訂錯誤處理例程? C++ 異常處理如何支援自訂錯誤處理例程? Jun 05, 2024 pm 12:13 PM

C++異常處理允許建立自訂錯誤處理例程,透過拋出異常並使用try-catch區塊捕捉異常來處理運行時錯誤。 1.建立一個派生自exception類別的自訂異常類別並覆寫what()方法;2.使用throw關鍵字拋出異常;3.使用try-catch區塊捕捉異常並指定可以處理的異常類型。

C++ Lambda 表達式如何進行異常處理? C++ Lambda 表達式如何進行異常處理? Jun 03, 2024 pm 03:01 PM

C++Lambda表達式中的異常處理沒有自己的作用域,預設不捕獲異常。要捕獲異常,可以使用Lambda表達式捕獲語法,它允許Lambda表達式捕獲其定義範圍內的變量,從而在try-catch區塊中進行異常處理。

Java函數中遞歸呼叫與異常處理有何關係? Java函數中遞歸呼叫與異常處理有何關係? May 03, 2024 pm 06:12 PM

遞歸呼叫中的異常處理:限制遞歸深度:防止堆疊溢位。使用異常處理:使用try-catch語句處理異常。尾遞歸優化:避免堆疊溢位。

您如何在PHP中有效處理異常(嘗試,捕捉,最後,投擲)? 您如何在PHP中有效處理異常(嘗試,捕捉,最後,投擲)? Apr 05, 2025 am 12:03 AM

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

PHP異常處理:透過異常追蹤了解系統行為 PHP異常處理:透過異常追蹤了解系統行為 Jun 05, 2024 pm 07:57 PM

PHP異常處理:透過異常追蹤了解系統行為異常是PHP用來處理錯誤的機制,由異常處理程序處理異常。異常類別Exception代表一般異常,而Throwable類別代表所有異常。使用throw關鍵字拋出異常,並使用try...catch語句定義異常處理程序。在實戰案例中,透過異常處理捕獲並處理calculate()函數可能拋出的DivisionByZeroError,確保應用程式在發生錯誤時也能優雅地失敗。

C++ 技術中的例外處理:如何在多執行緒環境中正確處理例外狀況? C++ 技術中的例外處理:如何在多執行緒環境中正確處理例外狀況? May 09, 2024 pm 12:36 PM

在多執行緒C++中,例外處理遵循以下原則:及時性、執行緒安全性和明確性。在實戰中,可以透過使用mutex或原子變數來確保異常處理程式碼線程安全。此外,還要考慮異常處理程式碼的重入性、效能和測試,以確保其在多執行緒環境中安全有效地運作。

C++ 技術中的異常處理:如何最佳化異常處理的效能? C++ 技術中的異常處理:如何最佳化異常處理的效能? May 09, 2024 am 10:39 AM

為了優化C++中的異常處理效能,可以實現以下四種技術:避免不必要的異常拋出。使用輕量級異常類別。優先考慮效率,設計只包含必要資訊的異常類別。利用編譯器選項實現最佳效能和穩定性平衡。

See all articles