C/C++錯(cuò)誤信息處理的常見方法及函數(shù)
前言
在 C/C++ 編程中,錯(cuò)誤信息的捕獲和處理是保證程序健壯性的重要部分。錯(cuò)誤通常通過函數(shù)的返回值或者全局變量 errno 來表示。為了方便調(diào)試和錯(cuò)誤處理,C/C++ 提供了多種函數(shù)和方法來獲取和輸出錯(cuò)誤信息。以下是 C/C++ 錯(cuò)誤處理的常見方法及函數(shù)介紹:
1. errno 和 perror()
**
errno**:errno是一個(gè)全局變量,當(dāng)系統(tǒng)調(diào)用或庫(kù)函數(shù)失敗時(shí),它會(huì)被設(shè)置為一個(gè)錯(cuò)誤代碼。errno是由操作系統(tǒng)在發(fā)生錯(cuò)誤時(shí)設(shè)置的,每個(gè)錯(cuò)誤代碼代表特定類型的錯(cuò)誤。**
perror()**:perror()用于打印基于errno錯(cuò)誤碼的錯(cuò)誤信息。它將errno的值轉(zhuǎn)換為對(duì)應(yīng)的錯(cuò)誤消息并輸出。如果提供了自定義的前綴字符串,則會(huì)一起輸出。
示例:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *file = fopen("non_existent_file.txt", "r");
if (!file) {
perror("File opening failed");
}
return 0;
}
輸出:
File opening failed: No such file or directory
在此例中,perror() 輸出了一個(gè)由 errno 設(shè)置的錯(cuò)誤信息,具體是“沒有這樣的文件或目錄”。
2. strerror()
- **
strerror()**:strerror()函數(shù)用于將errno錯(cuò)誤代碼轉(zhuǎn)換為可讀的字符串,返回與errno對(duì)應(yīng)的錯(cuò)誤消息的指針??梢栽诔绦蛑兄苯诱{(diào)用它來獲取詳細(xì)的錯(cuò)誤描述。
示例:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *file = fopen("non_existent_file.txt", "r");
if (!file) {
printf("Error: %s\n", strerror(errno));
}
return 0;
}
輸出:
Error: No such file or directory
3. perror() 和 strerror() 區(qū)別
perror()會(huì)自動(dòng)將錯(cuò)誤信息輸出到標(biāo)準(zhǔn)錯(cuò)誤流stderr,并可以附帶自定義的前綴。strerror()返回一個(gè)指向錯(cuò)誤信息的指針,可以在程序中自己控制輸出。
4. exit() 和 abort()
- **
exit()**:exit()用于退出程序并返回一個(gè)指定的狀態(tài)碼。返回的狀態(tài)碼可以用來表示程序的執(zhí)行狀態(tài),通常0表示成功,非零值表示錯(cuò)誤。
示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
if (some_error_condition) {
fprintf(stderr, "An error occurred\n");
exit(1); // Exit with status 1 (error)
}
return 0;
}
- **
abort()**:abort()用于立即終止程序,通常在程序遇到無法恢復(fù)的錯(cuò)誤時(shí)使用。調(diào)用abort()后,程序會(huì)立即中止,并且返回一個(gè)未定義的錯(cuò)誤狀態(tài)。
示例:
#include <stdlib.h>
#include <stdio.h>
int main() {
if (some_fatal_error) {
abort(); // Immediately terminate the program
}
return 0;
}
5. assert()
- **
assert()**:assert()是用于調(diào)試時(shí)的一個(gè)宏,檢查條件表達(dá)式是否為真。如果條件不為真,程序會(huì)輸出錯(cuò)誤信息并調(diào)用abort()終止程序。assert()主要用于開發(fā)和調(diào)試階段,不應(yīng)該用于生產(chǎn)代碼。
示例:
#include <assert.h>
#include <stdio.h>
int main() {
int x = 5;
assert(x == 10); // This will fail and abort the program
return 0;
}
6. setjmp() 和 longjmp()
- **
setjmp()**:setjmp()用于設(shè)置一個(gè)恢復(fù)點(diǎn)。如果程序在后續(xù)調(diào)用longjmp()時(shí)跳轉(zhuǎn)到該恢復(fù)點(diǎn),setjmp()會(huì)返回一個(gè)非零值。 - **
longjmp()**:longjmp()用于從setjmp()所在的地方跳轉(zhuǎn)到程序的某個(gè)恢復(fù)點(diǎn)。它可以用于錯(cuò)誤處理,但一般不推薦作為常規(guī)的錯(cuò)誤處理機(jī)制。
示例:
#include <setjmp.h>
#include <stdio.h>
jmp_buf env;
void error_recovery() {
printf("Error occurred, recovering...\n");
longjmp(env, 1); // Jump back to setjmp
}
int main() {
if (setjmp(env) != 0) {
printf("Recovered from error\n");
return 0;
}
error_recovery(); // Call this to simulate error
return 0;
}
7. strerror_r()
- **
strerror_r()**:strerror_r()是線程安全的strerror()版本,它將錯(cuò)誤信息寫入傳入的緩沖區(qū)中。由于strerror()不是線程安全的(它使用靜態(tài)緩沖區(qū)),所以在多線程程序中推薦使用strerror_r()。
示例:
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
char buf[256];
errno = ENOENT;
strerror_r(errno, buf, sizeof(buf));
printf("Error: %s\n", buf);
return 0;
}
8. perror() 和 strerror() 適用場(chǎng)景
- **
perror()**:適用于錯(cuò)誤發(fā)生時(shí)立即輸出錯(cuò)誤信息,通常與文件操作、系統(tǒng)調(diào)用等直接相關(guān)的錯(cuò)誤。 - **
strerror()**:適用于在多個(gè)地方需要引用或自定義錯(cuò)誤消息輸出的場(chǎng)景,尤其在日志記錄和調(diào)試時(shí)很有用。
常見的 C/C++ 錯(cuò)誤信息和函數(shù)
常見的錯(cuò)誤信息
- **
ENOMEM**:內(nèi)存不足 - **
EAGAIN**:暫時(shí)不可用,通常表示資源忙或阻塞 - **
EINVAL**:無效參數(shù) - **
EBADF**:無效的文件描述符 - **
EIO**:輸入/輸出錯(cuò)誤 - **
EPERM**:操作不允許 - **
ENOENT**:沒有文件或目錄
常見的函數(shù)
- **
fopen()、open()**:文件打開錯(cuò)誤,返回NULL或-1,需要使用errno判斷具體錯(cuò)誤。 - **
socket()**:創(chuàng)建套接字時(shí)的錯(cuò)誤。 - **
connect()、send()、recv()**:網(wǎng)絡(luò)編程中的錯(cuò)誤。
總結(jié)
C/C++ 提供了一系列強(qiáng)大的錯(cuò)誤處理機(jī)制,包括全局變量 errno 和函數(shù) perror()、strerror() 等來輸出和捕獲錯(cuò)誤信息。通過合理地使用這些函數(shù),可以有效地捕獲并報(bào)告程序中的錯(cuò)誤,幫助開發(fā)人員在調(diào)試和生產(chǎn)環(huán)境中定位問題。
到此這篇關(guān)于C/C++錯(cuò)誤信息處理的常見方法及函數(shù)的文章就介紹到這了,更多相關(guān)C/C++錯(cuò)誤信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)實(shí)戰(zhàn)教學(xué)
在本篇文章里小編給大家分享了關(guān)于C語言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)實(shí)戰(zhàn)教學(xué)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。2019-01-01
基于C語言實(shí)現(xiàn)的貪吃蛇游戲完整實(shí)例代碼
這篇文章主要介紹了基于C語言實(shí)現(xiàn)的貪吃蛇游戲完整實(shí)例代碼,對(duì)于學(xué)習(xí)游戲開發(fā)的朋友有一定的借鑒價(jià)值,需要的朋友可以參考下2014-08-08
使用C++實(shí)現(xiàn)跨進(jìn)程安全的文件讀寫鎖
在多進(jìn)程系統(tǒng)中,文件的并發(fā)讀寫可能導(dǎo)致數(shù)據(jù)競(jìng)爭(zhēng)、文件損壞等問題,為了確保多個(gè)進(jìn)程能夠安全地訪問同一文件,我們需要使用文件鎖,本文將介紹如何使用 C++ 實(shí)現(xiàn)文件鎖,并確保文件的并發(fā)讀寫操作是安全的,需要的朋友可以參考下2025-02-02
C語言實(shí)現(xiàn)斐波那契數(shù)列(非遞歸)的實(shí)例講解
下面小編就為大家?guī)硪黄狢語言實(shí)現(xiàn)斐波那契數(shù)列(非遞歸)的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
用C語言實(shí)現(xiàn)從文本文件中讀取數(shù)據(jù)后進(jìn)行排序的功能
這是一個(gè)十分可靠的程序,這個(gè)程序的查錯(cuò)能力非常強(qiáng)悍。程序包含了文件操作,歸并排序和字符串輸入等多種技術(shù)。對(duì)大家學(xué)習(xí)C語言很有幫助,有需要的一起來看看。2016-08-08
C++ OpenCV實(shí)現(xiàn)像素畫的示例代碼
這篇文章主要介紹了通過OpenCV進(jìn)行圖片像素的變化,從而形成像素畫效果的功能。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手試一試2022-01-01
浮點(diǎn)數(shù)在計(jì)算機(jī)中存儲(chǔ)方式是怎樣的
這篇文章介紹了浮點(diǎn)數(shù)在計(jì)算機(jī)中是如何存儲(chǔ)的,講解的比較詳細(xì),有需要的朋友可以參考一下。2016-06-06

