【问题标题】:How to prevent Third Party DLL's StackOverflow Exception from killing Main Application? [duplicate]如何防止第三方 DLL 的 StackOverflow 异常杀死主应用程序? [复制]
【发布时间】:2021-07-01 05:56:50
【问题描述】:

我们正在使用 PQScan 的 PDFToImage DLL 创建 PDF 预览。我们需要创建 PDF 第一页的预览图像。

每当我尝试获取图像时,它都会抛出 System.StackOverflowException。在 try-catch 块中无法捕获的内容会导致应用程序崩溃。

try
{
    using (PQScan.PDFToImage.PDFDocument doc = new PQScan.PDFToImage.PDFDocument())
    {
        doc.LoadPDF(UTFPDFPath);
        doc.DPI = 150;
        var temp = doc.PageCount;
    

        using (Bitmap bmp = doc.ToImage(0)) //System.StackOverflowException here
        {
            bmp.Save(BigPrevName, ImageFormat.Gif);
        }
    }
}
catch (Exception ex)
{
}

- $exception {“'System.StackOverflowException' 类型的异常被抛出。”} System.StackOverflowException

【问题讨论】:

  • 不幸的是,StackOverflowException 是一个令人讨厌的异常。也许您可以将其隔离在另一个进程中?
  • 它是否出现在特定/任何 pdf 中?库中是否有任何关于期待 SOException 的文档?
  • @Pac0 我怎样才能做到这一点?
  • 第三方库我们无能为力。也许我们可以检查是否有可用的最新版本,它可能最终解决了一些问题。我在使用其他第三方库时遇到了类似的问题,几乎浪费了一个月的时间来解决会话超时情况下的应用程序池崩溃问题,然后通过升级到最新版本来解决。
  • 保护您的进程的唯一方法是在不同的进程中运行可疑代码。查看重复项。

标签: c#


【解决方案1】:

这里的简短回答是“不”;无法可靠地捕获/恢复堆栈溢出场景。

  • 确保您使用的是最新版本(可能已修复!)
  • 查看文档是否将此列为已知问题以及可能的解决方法
  • 如果它是付费产品,请让他们修复它作为您支持的一部分
  • 如果它是开源的,请考虑自行修复并贡献修复程序

如果这些都不可能,那么回退将是编写第二个可执行文件,只是执行此处理(使用 IPC 或基于文件的方法从第二个进程获取数据或从第二个进程获取数据) - 然后生成第二个进程,如果它爆炸,则只有子进程已被烧毁。

【讨论】:

  • 这有帮助。我创建了另一个进程,在该进程中传输了代码。现在只有子进程被杀死。原始仍然有效。感谢您的帮助。
【解决方案2】:

正如 MSDN 所说,using 并不是为了捕获异常而设计的,因为它实际上是一种方便的方式来执行“try-finally”。你应该把它改成这样:

Bitmap bmp;
try
{
    bmp = doc.ToImage(0);
    bmp.Save(BigPrevName, ImageFormat.Gif);
}
catch (Exception ex)
{
    //process exception
}
finally
{
    if (bmp != null)
      bmp.Dispose();
}

【讨论】:

  • 问题清楚地显示了try/catch;这个答案的改变将无济于事 - 问题是堆栈溢出无法可靠地捕获
  • 是的,我错过了 catch 外面的那个如果可能的话会得到例外。谢谢指点!
猜你喜欢
  • 2012-04-05
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 2013-10-10
  • 1970-01-01
  • 2012-06-13
相关资源
最近更新 更多