這些都屬於流程式控制制過程,不是語言內建元素。
但abort是在SysUtils單元中定義的:
是通過拋出silent exception來退出整個程式。
Exit是System單元中定義的, 用來退出過程(例外情況,finally還是會被執行)
In Delphi, the Exit procedure immediately passes control away from the current procedure. If the current procedure is the main program, Exit causes the program to terminate.
Note: Exit passes control away from the current procedure, not merely the current block. But Exit does not violate the flow of control dictated by a try..finally construct; if Exit is called inside the try clause, the finally clause is still executed.
halt也是在System單元中定義的, 退出程式,且可以返回一個代碼給作業系統。
procedure Halt [ ( Exitcode: Integer) ];
出錯處理函數abort、exit、atexit、strerror. . .C/C++ 2009-02-19 10:55:20 閱讀526 評論0 字型大小:大中小 訂閱 .
摘要:本文詳細講述了幾個出錯處理的函數abort、exit、atexit、strerror函數的使用方法,並給出來具體的樣本程式。
函數名: abort
功 能: 異常終止一個進程
用 法: void abort(void);
標頭檔:#include
說明:abort函數是一個比較嚴重的函數,當調用它時,會導致程式異常終止,
而不會進行一些常規的清除工作,比如釋放記憶體等。
程式例:
#include
#include
int main(void)
{
puts( "About to abort..../n" );
abort();
puts( "This will never be executed!/n" );
exit( EXIT_SUCCESS );
}
[root@localhost error_process]# gcc abort.c
[root@localhost error_process]# ./a.out
About to abort....
已放棄
-----------------------------------
標頭檔 #include
定義函數 void exit(int status);
exit()用來正常終結目前進程的執行,並把參數 status 返回給父進程,
而進程所有的緩衝區資料會自動寫回並關閉未關閉的檔案。
它並不像abort那樣不做任何清理工作就退出,而是在完成所有的清理工作後才退出程式。
----------------------------------------
atexit(設定程式正常結束前調用的函數)
標頭檔 #include
定義函數 int atexit (void (*function)(void));
傳回值 如果執行成功則返回 0,否則返回-1,失敗原因存於 errno 中。
atexit()用來設定一個程式正常結束前調用的函數。當程式通過調用 exit()或從 main 中返回時,參數 function 所指定的函數會先被 調用,然後才真正由 exit()結束程式。
很多時候我們需要在程式退出的時候做一些諸如釋放資源的操作,但程式退出的方式有很多種,比如main()函數運行結束、在程式的某個地方用exit() 結束程式、使用者通過Ctrl+C或Ctrl+break操作來終止程式等等,因此需要有一種與程式退出方式無關的方法來進行程式退出時的必要處理。方法就 是用atexit()函數來註冊程式正常終止時要被調用的函數。
atexit()函數的參數是一個函數指標,函數指標指向一個沒有參數也沒有傳回值的函數。atexit()的函數原型是:int atexit (void (*)(void));
在一個程式中最多可以用atexit()註冊32個處理函數,這些處理函數的調用順序與其註冊的順序相反,也即最先註冊的最後調用,最後註冊的最先調用。
#include
#include
void my_exit(void)
{
printf( "Before exit..../n" );
}
int main(void)
{
atexit( my_exit );
return 0;
}
[root@localhost error_process]# gcc atexit.c
[root@localhost error_process]# ./a.out
Before exit....
-----------------------------------------------------
strerror(返回錯誤原因的描述字串)
標頭檔 #include
定義函數 char * strerror(int errnum);
strerror() 用來依參數 errnum 的錯誤碼來查詢其錯誤原因的描述字串,然後將該字串指標返回。
這時如果把 errno 傳個strerror,就可以得到可讀的提示資訊,而不再是一個冷冰冰的數字了。
傳回值 返回描述錯誤原因的字串指標。
#include
#include
int main(void)
{
int i;
for ( i=0; i
{
printf( "%d:%s/n", i, strerror(i) );
}
return 0;
}
[root@localhost error_process]# gcc strerror.c
[root@localhost error_process]# ./a.out
0:Success
1:Operation not permitted
2:No such file or directory
3:No such process
4:Interrupted system call
5:Input/output error
6:No such device or address
7:Argument list too long
8:Exec format error
9:Bad file descriptor
[root@localhost error_process]#
http://hi.baidu.com/flyownway/blog/item/0cfb6703842d85ea08fa93b0.html
------------------------------------------------
3.9 錯誤處理
正如我們已經看到的,本章介紹的許多系統調用和函數 都會因為各種各樣的原因而失敗。失敗時,它們會設定外部變數errno的值來指明失敗的原因。許多不同的函數庫都把這個變數用做報告錯誤的標準方法。我們 也反覆告誡大家,程式必須在函數報告出錯之後立刻檢查errno變數,因為它可能被下一個函數調用所覆蓋,即使下一個函數自身並沒有出錯,也可能會覆蓋這 個變數。
錯誤碼的取值和含義都列在標頭檔errno.h裡,其中包括:
l EPERM:操作不允許。
l ENOENT:檔案或目錄不存在。
l EINTR:系統調用被中斷。
l EIO:I/O錯誤。
l EBUSY:裝置或資源忙。
l EEX IST:檔案存在。
l EINVA L:無效參數。
l EMFILE:開啟的檔案過多。
l ENODEV:裝置不存在。
l EISDIR:是一個目錄。
l ENOTDIR:不是一個目錄。
有兩個非常有用的函數可以用來報告出現的錯誤,它們是strerror和perror。
3.9.1 strerror函數
strerror函數把錯誤編碼映射為一個字串,該字串對發生的錯誤類型進行說明。這在記錄錯誤條件時十分有用。
函數原型如下:
3.9.2 perror函數
perror函數也把error變數中報告的當前錯誤映射到一個字串,並把它輸出到標準錯誤輸出資料流。該字串的前面先加上參數s(如果s不為空白)給出的資訊,再加上一個冒號和一個空格。
函數原型如下:
請看下面的例子:
它會在標準錯誤輸出中給出如下的輸出結果:
CancelUpdates是繼承自ADO原生介面的方法,用來取消尚未提交的記錄,與CancelBatch(arAll)的作用一樣,原生的CancelBatch和CancelUpdates通常只用在批量模式中,但是在TADOQuery的繼承中對單記錄模式應當同樣有效。
Cancel是繼承自TDataset的虛方法,通過TADOQuery的父類TCustomADODataset Override,使其調用ADO原生介面的CancelUpdate方法,取消當前編輯或插入的記錄