【问题标题】:catching an exception in std:sort在 std:sort 中捕获异常
【发布时间】:2016-06-30 17:24:37
【问题描述】:

我想问一下,如何捕获在函数std:sort 中某处抛出的异常。我试过这段代码

try
{
   sort([arguments])
}
catch(...)
{
   cout << "error";
}

但是,它不起作用。有没有可能,这个怎么写?

【问题讨论】:

  • 怎么不行?怎么了?可以发minimal reproducible example吗?
  • 只是出于好奇,有什么例外?
  • 如果您在调试器中看到异常的类型,请尝试按名称捕获它
  • 我没有看到异常类型,因为我没有在调试模式下运行应用程序。我能做的最好的就是:Unhandled exception at 0x0040627E in graph.exe: 0xC0000005: Access violation reading location 0x00F5F318. 我什至不能提供一个最小的例子,因为这是一个相当大的项目的一部分,它只在非常特殊的情况下抛出异常。
  • @E.Brown 也不例外。您的程序正在做一些完全非法的事情,而操作系统正在终止它。您的代码可能存在缓冲区溢出、与传递给排序的迭代器或比较函数相关的类似内容的无效指针。

标签: c++ exception-handling


【解决方案1】:

根据评论,回复:“访问冲突”——这是操作系统报告的异常,而不是 C++ 异常。这通常是传递不创建严格弱排序的比较对象的结果。由于您没有费心展示“[参数]”,因此无法进一步诊断。

【讨论】:

    【解决方案2】:

    The reasons that sort will throw 是:

    • 元素比较抛出
    • 元素交换(或移动)投掷
    • 迭代器上的操作抛出

    因此,要使sort 在没有无效参数的情况下抛出(这将导致未定义的行为),您必须使用自定义迭代器或自定义比较器。

    既然写一个 conmarator 要容易得多,我会这样告诉你:

    try {
        sort(begin(foo), end(foo), [](auto& lhs, auto& rhs) {
            throw exception();
            return lhs < rhs;
        });
    } catch(...) {
        cout << "error\n";
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 2012-07-10
      • 1970-01-01
      • 2011-05-29
      • 2011-07-02
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多