abort、exit、atexit、strerror函数的使用方法

来源:互联网 发布:色情男女张国荣 知乎 编辑:程序博客网 时间:2024/06/11 15:27

这些都属于流程控制过程,不是语言内建元素。

但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<10; 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方法,取消当前编辑或插入的记录