Tag: error handling

共享库中的error handling策略 – C.

我正在使用C编写跨平台共享库(在Linux中的.so和在Windows中的.dll )。目前,当出现错误时,库函数会返回正确的错误代码并将错误信息写入stderr 。 库函数还向stdout发送一些信息和调试消息。 这适用于基于控制台的客户端。 现在这个库将拥有使用C ++和wxWidgets编程的GUI的客户端程序。 我想知道处理错误并通知错误的最佳做法是什么? UI应用程序可以访问所有平台上的stdout和stderr数据吗? 我想的另一种方法是库初始化函数初始化一个具有函数指针的结构。 库上的所有函数都将采用此结构的实例并调用函数指针。 这样客户端可以选择打印消息的位置。 我想知道解决这个问题的明显方法是什么? 任何帮助都会很棒。

sprintf_s缓冲区太小

以下代码导致错误并杀死我的应用程序。 这是有意义的,因为缓冲区只有10个字节长,文本长度为22个字节(缓冲区溢出)。 char buffer[10]; int length = sprintf_s( buffer, 10, “1234567890.1234567890.” ); 我如何捕获此错误,以便我可以报告它而不是崩溃我的应用程序? 编辑: 阅读下面的评论后,我选择_snprintf_s。 如果它返回-1值,则缓冲区未更新。 length = _snprintf_s( buffer, 10, 9, “123456789” ); printf( “1) Length=%d\n”, length ); // Length == 9 length = _snprintf_s( buffer, 10, 9, “1234567890.1234567890.” ); printf( “2) Length=%d\n”, length ); // Length == -1 length = _snprintf_s( buffer, 10, […]

什么是“cerr”和“stderr”?

它们之间有什么区别?它们是如何使用的? 谁能指点我的例子? 具体来说,如何在两种情况下“写入”流,以及如何恢复和输出(即屏幕)已写入文本的文本? 另外,“屏幕”输出本身就是一个流吗? 也许我不太了解溪流。 我知道,这当然也可以保存到文件中。 所有这些都使用fprintf / fscanf等吗?

在初始化C中的多个资源的函数中,有哪些处理错误(清理和中止)的好方法?

首先,如果有人可以改写问题以使其更清楚,请做。 C编程中常见的情况是要按特定顺序初始化/分配多个资源。 每个资源都是后续资源初始化的先决条件。 如果其中一个步骤失败,则必须取消分配先前步骤的剩余资源。 理想的伪代码(利用神奇的通用pure-unobtainium clean_up_and_abort()函数)看起来大致如下: err=alloc_a() if(err) clean_up_and_abort() err=alloc_b() if(err) clean_up_and_abort() err=alloc_c() if(err) clean_up_and_abort() // … profit() 我已经看到了几种处理这种方法的方法,所有这些方法似乎都有明显的缺点,至少在人们倾向于考虑“良好实践”方面。 在处理这种情况时,构造代码的最可读和最不容易出错的方法是什么? 效率是优选的,但为了便于阅读,可以牺牲合理的效率。 请列出优点和缺点。 欢迎讨论多种方法的答案。 我们的目标是希望最终得到一套解决这个问题的几种首选方法。 我将从我已经看过的一些方法开始, 请对它们进行评论并添加其他方法 。

stdio总是设置errno吗?

当stdio流遇到错误(但不是EOF)时,将设置流的错误指示符,以便ferror()将返回非零值。 我一直认为在errno可以获得更多信息。 但我怎么知道这个? 某些函数的文档[例如Linux下的man fopen ]表示也将设置errno 。 然而, man fgets根本没有提到errno 。 glibc信息页面令人放心: 除了设置与流关联的错误指示符之外,对流进行操作的函数还以与对文件描述符进行操作的相应低级函数相同的方式设置“errno”。 但我不知道这种保证有多强。 它是否需要C标准? Visual C / C ++会发生什么?

检查返回int的函数时出错

如果我有一个返回某种指针的函数,我会通过设置错误时返回NULL来检查错误。 char *foo(void) { //If stuff doesn’t go okay return NULL; } char *bar = foo(); if(!bar) return 1; 这很有效,因为我知道在这种情况下我永远不会想要返回NULL。 但是,有时我会有返回整数的函数(在这种情况下,我从配置文件中读取int)。 但是,问题是现在无法检查返回的值是否有错误,因为任何值(包括0)都可能是真的。 几个解决方法: 在函数中包含错误代码参数 返回错误代码并包含int指针作为参数 这两个问题都是我有一组函数,它们都做同样的事情,但对于不同的类型,我想维护一个常规的接口,以便它们可以以相同的方式使用。 是否有其他解决方案不涉及更改function的接口? 处理这种情况最常见的方法是什么? 选择解决方案 感谢您对此的所有想法和答案。 最后我决定,如果函数旨在返回一些数据,则只能通过error参数返回错误。 否则,将直接返回错误。 我选择了这个根,因为通常我发现当返回更复杂的数据forms时,潜在错误的数量几乎总是大于1.这意味着使用NULL作为错误数据的唯一来源是不切实际的,因为它意味着没有确定错误实际是什么的方法。 对于将数据作为int返回的函数,也不可能将多个不同的错误代码与有效数据区分开来。 当然,对于没有真正返回任何数据的函数,情况也是如此,在这种情况下,我可以自由地将返回值用作错误代码。 我也喜欢上述模式明确区分返回数据的函数和不返回数据的函数。

我们应该检查内存分配是否失败?

我已经看到很多代码在进行分配时检查NULL指针。 这使代码变得冗长,如果没有一致地完成,只有当程序员感觉到它时,甚至不能确保程序在地址空间用完时不会崩溃。 此外,如果程序无法进行更多分配,那么它无论如何都无法完成其function,对吧? 所以我的问题是,对于大多数程序来说,根本不检查并且如果内存耗尽就让程序崩溃是不是更好? 至少代码更具可读性。 注意 我说的是在现代计算机上运行的桌面应用程序(至少2 GB的地址空间),而且绝对不会运行航天飞机,生命支持系统或BP的石油平台。 最重要的是,我在谈论使用malloc但从未真正超过5 MB内存使用量的程序。

在C中捕获段错误

我有一个程序,有时会从指针算术中发生段错误。 我知道这种情况发生了,但是我不能提前检查它是否是段错误 – 要么我可以“预扫描”输入数据以查看它是否会导致段错误(这是无法确定的),或者我可以修改它不使用指针算法,这将需要大量的工作,或者我可以尝试捕获段错误。 所以我的问题: 1)如何在C中捕获段错误? 我知道操作系统中的某些内容会导致段错误,但是如果C程序的Segmentation fault比仅仅Segmentation fault更优雅,那么它可以做些什么呢? 2)这有多便携? 我想这是一个非常不可移植的行为,所以如果你发布任何代码来捕获段错误,请告诉我它的工作原理。 我在Mac OS X上,但我希望我的程序可以在尽可能多的平台上工作,我想知道我的选择是什么。 并且不用担心 – 基本上我想要做的就是打印一个更加用户友好的错误消息并释放一些malloc() ed内存,然后死掉。 我不打算只是忽略我得到的所有段错误并继续前进。

使用longjmp / setjmp进行Cerror handling有哪些“好”的方法?

我必须将C用于一个项目,我正在考虑使用longjmp/setjmp进行error handling,因为我认为在一个中心位置处理错误要比返回代码容易得多。 如果有一些关于如何做到这一点的线索,我将不胜感激。 如果发生任何此类错误,我特别关注正确完成资源清理。 另外,我如何处理导致multithreading程序使用它们的错误? 更好的是,是否有一些C库已经存在以进行错误/exception处理?

我应该检查malloc()是否成功?

如果成功,应该在每个malloc()之后检查吗? malloc()是否有可能失败? 那么会发生什么? 在学校我们被告知我们应该检查,即: arr = (int) malloc(sizeof(int)*x*y); if(arr==NULL){ printf(“Error. Allocation was unsuccessful. \n”); return 1; } 有什么做法? 我可以这样做吗: if(!(arr = (int) malloc(sizeof(int)*x*y))