为什么C++中不经常使用异常?
Why aren't exceptions used often in C++?
在这个问题听起来很愚蠢之前,让我解释一下。我用了很多c#、Java和c++。我注意到的主要问题是错误处理,特别是在第三方库中。在c#和Java中,处理错误的一般方法是通过异常,而不是传统的C处理错误的方法,即int。
这是我在c#/Java中经常发现的:
try
{
ExternalLibraryInit();
}
catch (ExternalLibraryException ex)
{
//error
}
这是我在c++中经常发现的:
if (ExternalLibraryInit()) //Generally returns an int, which no error is 0 and a error is
//anything else
{
//error
}
为什么人们倾向于忽略c++中的异常?我不明白为什么不使用它们,这不是它们存在的意义吗?
您所展示的示例(条件if)不符合有效情况的条件。
异常用于处理异常情况。在您的例子中,函数只是返回一个值,两个结果都是预期,没有什么异常。该函数可能是一个C(C没有异常来抛出任何) api,而您没有源代码。在这种情况下,您根本无法摆脱条件if。检查后如何处理错误/异常完全取决于您。最有可能的是抛出一个异常并在层次结构中传播它,但那是在你以它要求的方式处理api之后。
- 在c++的早期,一些平台不支持异常。有一种普遍的观点认为异常处理是一种性能开销。在现实中,分析通常不会显示任何这样的瓶颈。
- 大多数编写c++代码的程序员都是迁移到c++的C程序员,并且没有清楚地将异常作为一个概念来理解。
我是一个c++程序员,我几乎从不使用异常,因为这种非局部控制流使我更难以推断我的程序正在做什么。我很擅长推理我看到的控制流结构而不擅长推理我没有看到的控制流结构。其他人的感觉不同,并相应地编写程序。
相关文章:
- 当类定义不可见时捕获异常
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 在 Arraydeque 中设置异常不会停止执行
- 是否有特殊原因导致堆栈和堆在C++资源中不经常提及?
- C#调用C 第三方DLL(无源)提出异常 - 不兼容PinVoke
- 引发异常不一致
- 异常不影响值
- 提升program_options异常不替换 %canonical_option% 标记
- C++STL映射异常.(不可变树的根)
- 异常不会使用boost :: future/boost :: Promise跨线程正确传播
- 为什么访问冲突异常不能被 捕获.NET4.0.
- 默认构造函数C++异常不会引发吗?
- MSVC std::异常不符合标准?
- 异常不会中断指令流
- 为什么C++中不经常使用异常?
- 异常不工作的c++程序
- 异常-不正确的行为在vc++ 2015 CTP终极
- 为什么我的信号处理程序(引发异常)不会多次触发?