当前位置:  开发笔记 > 编程语言 > 正文

C++错误处理 - 示例代码的良好来源?

如何解决《C++错误处理-示例代码的良好来源?》经验,为你挑选了3个好方法。

几乎所有代码示例代码都忽略了错误处理(因为它"混淆了示例代码正在解决的问题").我的编程知识主要来自书籍和网站,你很少在那里看到任何错误处理,更不用说好东西了.

哪些地方可以看到C++错误处理代码的好例子?特定的书籍,特定的开源项目(最好具有要查看的文件和功能)以及特定的网页或网站都将被感激地接受.



1> fhe..:

Herb Sutter和Andrei Alexandrescu的书" C++编码标准"附有关于错误处理和异常的整章,包括

自由地断言以记录内部假设和不变量

建立合理的错误处理策略,并严格遵守

区分错误和非错误

设计并编写错误安全的代码

更喜欢使用例外来报告错误

按价值投掷,以参考方式捕获

适当地报告,处理和翻译错误

避免异常规范

每个主题还包括一个例子,我发现它是一个非常有价值的资源.


+1(由于来源命名和项目符号摘要)。

2> gbjbaanb..:

"使用例外""使用错误代码"从未像示例所示那样明确.

对程序流使用错误代码.如果您遇到预期的错误,请不要抛出异常.例如,您正在读取文件,您可能会因"找不到文件","文件已锁定"而抛出异常; 但永远不要为"文件结束"扔一个.

如果你这样做,你永远不会编写简单的循环,你总是将代码包装在异常处理程序中.并且不要忘记异常非常慢,这在大型多线程服务器中尤其重要.(在桌面应用程序中根本不重要).

其次,要非常小心异常层次结构.你可能认为有一个Exception类,然后NetException从它派生一个,然后SMTPException为你的SMTP类派生.但除非您在基类中保存通用数据,否则您将始终必须捕获该层次结构中的每种类型的异常.例如,如果您在SMTPException类中列出SMTP错误的原因,则必须捕获它 - 如果您只捕获Exception类型,则无法访问SMTPException成员.解决此问题的一个好方法是在基本异常类中使用字符串和int成员,并且仅使用它们,即使对于派生类型也是如此.不幸的是std::exception只提供一个字符串:(

有人说这样做意味着你可能只有一个异常类型,特别是因为你总是会捕获基类类型.

如果您确实使用了异常,则必须使用比使用错误代码更多的数据来填充它们.如果出现错误,您必须立即处理它们,否则它们会在代码中丢失.除了一个例外,它可能会被抛到很多位置 - 就像Roddy的例子一样.DoC被调用,并从中获得2个级别的异常DoA.除非您指定特定于代码的错误,否则您DoA可能会认为它是从DoB函数中抛出的.(简单的例子,但我看到其中一个异常被处理了许多水平下降调用堆栈的代码,这是AB ST次调试.这尤其适用于面向对象程序)

所以希望,我已经给了你足够的思考.事情的简单事实是,风格在错误处理方面没有任何意义,实用性就是一切.如果必须在任何地方放置日志语句,则可能会发生错误,然后执行此操作.更重要的是,您可以看到代码出错的地方(以及正在处理的数据),而不是您拥有优雅的异常层次结构,或者您已经使用异常处理程序填充了代码.如果您无法轻松跟踪错误,则错误处理代码无效.

例外是好的,使用它们.但想想你正在做什么,不要滥用或过度使用它们.一个误用的异常比没有错误处理更糟糕(因为你可以抓住一个崩溃转储并查看未处理的异常,以便在几秒钟内找到错误.有一个被吃掉和被忽略的例外,你就被塞满了).

多年来我发现调试的最大助手是日志记录.写日志,写很多日志.



3> Steve..:

我更喜欢本文中讨论的异常处理.它可以生成干净的代码,避免显式创建/删除对象,只是为了处理异常. http://www.informit.com/articles/article.aspx?p=373339

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有