投掷,返回或错误?

时间:2008-11-21 01:02:09

标签: errno

我正在创建一个系统。我想知道的是,如果msg不受支持,它该怎么办?我应该说不支持的消息吗?我应该返回0还是-1?或者我应该设置一个errno(base-> errno_)。有些消息我不在乎是否有错误(例如setBorderColour)。其他我会(addText或者如果我创建一个保存cmd可能保存)。

我想知道最好的方法是什么?1)快速编码2)调试3)扩展和维护。我可能会调试第三,它很难调试ATM,但那就是有很多遗漏的代码,我没有填写。实际的错误不是很难纠正。什么是让用户知道有错误的最好方法?

系统的工作方式与此类似但不完全相同。这是C风格,mycode有一堆内联函数,包含settext(const char * text){到msg(this,esettext,text)

Base base2, base;
base = get_root();
base2 = msg(base, create, BASE_TYPE);
msg(base2, setText, "my text");
const char *p = (const char *)msg(base2, getText);

4 个答案:

答案 0 :(得分:8)

通常,如果它是C ++,除非性能至关重要,或者除非您可能在不支持异常的环境(例如嵌入式平台)中运行,否则更喜欢异常。到目前为止,异常是调试的最佳选择,因为它们在发生时非常明显并被忽略。此外,例外是自我记录。它们有自己的类型名称,通常包含解释错误的消息。返回代码和错误代码需要单独的代码定义和某种带外方式来传达代码在任何给定上下文中的含义(例如,手册页,注释)。

为了快速编码,返回代码可能更容易,因为它们不涉及可能定义您自己的异常类型,并且错误检查代码通常不像异常那样冗长。但当然最大的风险是静默忽略错误返回代码要容易得多,导致问题直到发生之后就不会被注意到,这使得调试和维护成为一场噩梦。

尽量避免使用errno,因为它本身非常容易出错。它是一个全球性的,所以你永远不知道谁在重置它,它最明确地线程安全。

编辑:我刚刚意识到你的意思是一个errno成员变量而不是C风格的errno。这是更好的,因为它不是全局的,但你仍然需要额外的结构来使它的线程安全(如果你的应用程序是多线程的),它保留了返回代码的所有问题。

答案 1 :(得分:2)

返回错误代码需要遵守规则,因为必须明确检查错误代码然后再传递。我们编写了一个使用这种方法的大型基于C的系统,并且需要一段时间才能删除所有“丢失”的错误。我们最终开发了一些技术来捕获这个问题(例如将错误代码存储在线程全局位置并在顶层检查以查看返回的错误代码是否与保存的错误代码匹配)。

异常处理更容易快速编码,因为如果你正在编写代码而你不确定如何处理错误,你可以让它向上传播(假设你没有使用Java,你必须处理检查异常)。它更适合调试,因为您可以获得异常发生位置的堆栈跟踪(并且因为您可以构建顶级异常处理程序来捕获应该在其他地方捕获的问题)。维护更好,因为如果你做得对,你会更快地收到问题的通知。

然而,异常处理存在一些设计问题,如果你弄错了,你的情况会更糟。简而言之,如果您编写的代码不知道如何处理异常,则应该让它传播开来。太多的程序员捕获错误只是为了转换异常然后重新抛出它,导致意大利面条异常代码有时会丢失有关问题原始原因的信息。这假设您在顶层(入口点)有异常处理程序。

答案 2 :(得分:0)

就个人而言,当涉及输出图形时,我觉得无声的失败是好的。它只是让你的照片错了。

无论如何,图形错误都非常容易被发现。

答案 3 :(得分:0)

就个人而言,如果它是纯粹的'C',我会在你的Base结构中添加一个errno。如果这是C ++,我会抛出异常。

这取决于这些错误的“致命”程度。用户是否真的需要查看错误,还是其他开发人员的启发?

为了可维护性,您需要清楚地记录可能发生的错误,并包括错误处理的明确示例。