c - 错误检查及其增加的长度 - 是否有类似嵌入式系统编程的中断?

标签 c error-handling

当然有必要检查某些操作是否按预期发生:调用 mallocfopenfgetc

但是,有时添加这些检查会使代码变得太长 - 特别是对于非常简单的函数。例如,我有一个函数,我必须打开一个文件,读入一些参数,并根据刚刚读入的内容分配内存。

因此,代码最终看起来像这样:

  • 打开文件
  • 检查文件是否打开
  • 读取参数
  • 检查文件 EOF 是否未被读取(如果是,则文件格式不正确)
  • 分配内存
  • 检查内存分配是否按预期发生

等等。

这里似乎有很多冗余。至少对于我的简单程序来说,如果上面的任何检查文件,我只是报告错误并将控制权返回给操作系统。代码最终看起来像这样:

    if(filePointer == NULL){
        perror("Error X occured");
        exit(EXIT_FAILURE);
    }

因此,由于这种错误检查,一个简单的几行函数可能会变成 20 行或更多行。是否有一些地方可以汇总这些错误的确定?

只是想知道我是否遗漏了什么。

编辑:例如,有没有办法在某些事件发生时中断程序流? IE。如果 EOF 被过早读取,则跳转到某个通知用户的函数(类似于嵌入式系统中的中断)。

最佳答案

这是每个 C 程序员在其职业生涯的某个时刻都会问的一个问题。您是正确的,您的代码的某些部分将具有比实际有用的生产代码更多的错误处理代码行。我过去使用的一种简化错误处理的技术是实现错误函数,如下所示

static FILE *fpin   = NULL;
static FILE *fpout  = NULL;
static BYTE *buffer = NULL;

static void error( char *msg, char *name )
{
    if ( msg != NULL )
    {
        if ( name != NULL )
            fprintf( stderr, "%s: %s\n", msg, name );
        else
            fprintf( stderr, "%s\n", msg );
    }

    if ( fpin != NULL )
        fclose( fpin );

    if ( fpout != NULL )
        fclose( fpout );

    if ( buffer != NULL )
        free( buffer );

    exit( 1 );
}

然后像这样使用

void main( int argc, char *argv[] )
{

    if ( argc != 3 )
        error( "Usage: ChangeBmp infile outfile" );
    if ( (fpin = fopen( argv[1], "rb" )) == NULL )
        error( "Unable to open input file", argv[1] );
    if ( (fpout = fopen( argv[2], "wb" )) == NULL )
        error( "Unable to open output file", argv[2] );

    size = sizeof( bmphead );
    if ( fread( &bmphead, 1, size, fpin ) != size )
        error( "Unable to read header", NULL );
    size = sizeof( bmpinfo );
    if ( fread( &bmpinfo, 1, size, fpin ) != size )
        error( "Unable to read info", NULL );

当然,这只有在错误函数可以访问所有必要的变量时才有效。对于简单的单文件程序,我只是将必要的变量设为全局变量。在较大的项目中,您可能需要更仔细地管理变量。

关于c - 错误检查及其增加的长度 - 是否有类似嵌入式系统编程的中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22704189/

相关文章:

创建子进程可以访问的共享字符串数组

c - c中的有效代码如何?看起来执行得很好

php - 如何检查永远不应该返回false的函数?

ajax - 使用HandleError属性类处理Http和Ajax请求的错误

c - 如何将数组的一部分从二维数组复制到 C 中的另一个数组

c# - pinvoke将ascii字符数组返回给c#

python - 无法捕获语法错误python

python - 在python中捕获错误时如何使异常发生异常?

ASP.NET CustomErrors 在 global.asax 或 web.config 中发生异常时不会触发

c++ - 将 MFRC522 UID 十六进制字节转换为可打印的十进制