C++ 为什么要创建一个异常对象';从stdexcept头派生的?

C++ 为什么要创建一个异常对象';从stdexcept头派生的?,c++,exception,exception-handling,C++,Exception,Exception Handling,我想知道为什么要创建一个异常对象来抛出从stdexcept头派生的异常,如一个从runtime_error派生的异常对象。关于为什么要这样做,我能真正找到的唯一一件事是,您可以访问虚拟函数“what”以获得适当的错误消息。但是,您不能将错误消息作为参数传递到运行时_error中,然后访问“what”吗 class divide_by_zero : public runtime_error { public: divide_by_zero() :runtime_error(

我想知道为什么要创建一个异常对象来抛出从stdexcept头派生的异常,如一个从runtime_error派生的异常对象。关于为什么要这样做,我能真正找到的唯一一件事是,您可以访问虚拟函数“what”以获得适当的错误消息。但是,您不能将错误消息作为参数传递到运行时_error中,然后访问“what”吗

class divide_by_zero : public runtime_error
{
public:
    divide_by_zero()
        :runtime_error( "this is a runtime error" ) {};
}


if( ... )
{
    throw divide_by_zero();
}
这和仅仅做像……这样的事情有什么不同

if( ... )
{
    throw std::runtime_error( "this is a runtime error" );
} 


try
{
    ...
}
catch( std::runtime_error& e )
{
    std::cerr << e.what()
              << std::endl;
}
if(…)
{
抛出std::runtime_错误(“这是一个运行时错误”);
} 
尝试
{
...
}
捕获(标准::运行时错误&e)
{

std::cerr它允许您根据特定API定制异常,同时还遵守
std::exception
提供的基本约定。这允许您在
main()中提供一个全面异常处理程序
或在DLL或.so文件的入口点,以防止异常从程序中泄漏。

退休忍者评论说“您可以捕获派生异常,而无需捕获所有
运行时错误
异常。”,这是一个关键点。您的代码可能希望您的
除以0
并希望忽略或记录它,但不希望say
std::locale::locale
引发的
运行时错误被隐藏

此外,请注意,如果您使用相同的类并依赖于
what()
-返回文本的比较,这将是非常“脆弱”的,因为投递站点通常希望能够随心所欲地重新编写消息,以提高其清晰度和实用性。这可能也会更慢


如果您使用自己的类,以后可以更方便地以结构化的方式对其进行充实,可能会将错误的一些细节或遇到错误时正在进行的处理放入其他变量中,这些变量可以轻松可靠地使用。这可以与在文本中嵌入新数据的事后移动形成对比,后者可以将当前代码与对消息“样式”和可能长度的预期混淆(例如,它可能会“吹出”一个对话框,使其无法清晰地显示在屏幕上),并使文本需要结构化(例如,移动到XML)或者容易出错的解析…

您可以让构造函数在消息中添加一些额外的信息,或者采取额外的操作您可以捕获派生的异常,而不捕获所有的
运行时\u错误
异常。很好,谢谢。这很有意义。我从来没有想过会这样。什么是DLL和.so文件?