java - 我可以在崩溃的 OS API 周围放置 try/catch 吗?

标签 java c++ winapi try-catch access-violation

我使用 Windows 操作系统库来处理图像文件。有时它会在没有明显原因的情况下深深地崩溃——所有的输入都是合理的,而不是线程问题。崩溃是内存 A/V。

那么,这样的事情有什么缺点:

try {
  pFoo = OsAPIThatCrashes();
} catch {
  pFoo = NULL;
}

那还能行吗?我们不在代码中的任何其他地方使用异常。

最佳答案

一方面,虽然我们都喜欢抨击 MS 软件中的缺陷,但在 100 个案例中有 99 个问题不是操作系统、编译器或标准库中的错误,而是代码中的错误调用它。无论您使用的是什么 Win API - 它都经过了比大多数(如果不是全部)代码使用过的代码更彻底的测试。

此外,try/catch 捕获 C++ 异常,而不是操作系统异常。 (早期版本的 VC 做错了,但后来的版本有正确的默认值。)所以 try/catch 不会捕获 AV。也就是说,VC 提供了捕获操作系统异常的方法。我认为它称为结构化异常处理并以 __try/__catch 为中心,但我不确定,因为我从未使用过它。然而:

一旦您的应用程序遇到 AV,所有的赌注都会落空。 AV 只是未定义行为表现出来的一种方式,一旦您(或 API 代码,但不太可能)调用未定义行为,您就无法假设应用程序的状态。你不应该继续。

总结一下:你应该试着找出你做错了什么。做到这一点的一个好方法是尝试将问题归结为一小段重现问题的示例代码。在 90% 的情况下,这将揭示错误。如果即使是一小段代码也重现了问题,而您仍然不知道问题出在哪里,那么您有一个很好的重现案例可以返回(或提供 MS 支持)。 IME,在这 10% 的 9 中有人指出了你的错误,只有剩下的 1% 会揭示一个你没有自己犯的错误。

关于java - 我可以在崩溃的 OS API 周围放置 try/catch 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1716665/

相关文章:

java - 是否可以在main中调用非静态方法?

java - @Inject 和 java.security.Provider 组合是否给出了实例的范围配置?

C++ 嵌套类正在生成对外部类的 undefined reference

winapi - "GetForegroundWindow: identifier not found"在 Visual Studio 2015

c++ - 64位架构下的CreateService

winapi - 在进程间使用事件对象

java - 如何使用我创建的对象实例加载 ArrayList

c++ - 递归函数是否可以在不将常量作为参数发送给它的情况下了解首次调用它的函数中的常量?

c++ - 将移动的 b2body 移动到特定位置

java - Gmail SMTP 服务器请求数/秒有限制吗?