如何将无效的fgetpos调用捕获为C++;Windows上的异常? 在Visual C++ 2008中,我想“捕获”一个异常,如这里所示: try { int foo = 20; ::fgetpos(0, (fpos_t*)&foo); } //...

如何将无效的fgetpos调用捕获为C++;Windows上的异常? 在Visual C++ 2008中,我想“捕获”一个异常,如这里所示: try { int foo = 20; ::fgetpos(0, (fpos_t*)&foo); } //...,c++,visual-c++,exception,std,seh,C++,Visual C++,Exception,Std,Seh,以下是我为尝试成功捕获所做的调整: SEH被激活(/eha) 我添加了一个捕获(…) 我添加了一个向量 我已经添加/调整了SEH语法:_try/_,除了(异常执行处理程序) 简言之,我已经尝试了“书中的所有内容”,但仍然无法捕捉到例外。如果我将对::fgetpos的调用替换为inthey=foo/0,那么突然之间,上述所有技术都会按预期工作。因此,我正在处理的来自:fgetpos的异常在某种程度上是“特别的” 有人能解释一下为什么::fgetpos错误看起来不可跟踪,以及如何解决它吗 更新在VS

以下是我为尝试成功捕获所做的调整:

  • SEH被激活(/eha)
  • 我添加了一个捕获(…)
  • 我添加了一个向量
  • 我已经添加/调整了SEH语法:_try/_,除了(异常执行处理程序)
  • 简言之,我已经尝试了“书中的所有内容”,但仍然无法捕捉到例外。如果我将对
    ::fgetpos
    的调用替换为
    inthey=foo/0
    ,那么突然之间,上述所有技术都会按预期工作。因此,我正在处理的来自
    :fgetpos
    的异常在某种程度上是“特别的”

    有人能解释一下为什么::fgetpos错误看起来不可跟踪,以及如何解决它吗

    更新在VS IDE中执行时,输出窗口不会命名异常。它所说的是:

    Microsoft Visual Studio C运行时库在MyProgram.exe中检测到一个致命错误

    不是很有帮助。当我从命令行运行console应用程序时,会出现一个崩溃对话框。对话的“问题详情”部分包括以下信息:

    问题事件名称:BEX
    异常偏移量:0002fd30
    异常代码:c0000417
    异常数据:00000000
    附加信息1:69ad
    附加信息2:69添加FB19767B221C8E3E7A5CD2F4AE
    附加信息3:b1ff
    附加信息4:B1FFCA30CADDC78C19F19B6D150997F


    最有可能的情况是,运行库为您捕获它,并在不返回或传播异常的情况下发出一个调试对话框——这是一个CRT调用,他们可以在其中添加任何他们喜欢的异常捕获代码。在库函数中捕获硬件异常在VisualStudio的权限范围内,特别是当您在IDE中或在调试模式下运行时,运行时需要捕获硬件异常


    当然,当您除以零时,这里就没有库调用来编写额外的捕获代码。

    最有可能的情况是,运行时为您捕获它,并在不返回或传播异常的情况下发出调试对话框-这是一个CRT调用,他们可以在其中添加任何他们喜欢的异常捕获代码。在库函数中捕获硬件异常在VisualStudio的权限范围内,特别是当您在IDE中或在调试模式下运行时,运行时需要捕获硬件异常



    当然,当您除以零时,这里就没有库调用来编写额外的捕获代码。

    由于转储中的代码对应于
    STATUS\u INVALID\u CRUNTIME\u参数
    ,请尝试,因为转储中的代码对应于
    STATUS\u INVALID\u CRUNTIME\u参数
    ,尝试

    不要对异常类型保密。查看输出窗口。什么异常?请注意,调用
    ::TerminateProcess()
    不是异常,即使两者都会导致程序退出。@Ben:我不知道CRT例程可能会调用::TerminateProcess,而不尝试寻找异常筛选器。我认为,在Visual Studio中启用“第一次机会异常捕获”,可以更好地了解问题,因此,您可以在CRT代码中看到生成异常的行和(单步执行)捕获异常的异常处理程序。您是否考虑过更好的解决方案:不要将无效参数传递给库函数-|请不要对异常类型保密。查看输出窗口。什么异常?请注意,调用
    ::TerminateProcess()
    不是异常,即使两者都会导致程序退出。@Ben:我不知道CRT例程可能会调用::TerminateProcess,而不尝试寻找异常筛选器。我认为,在Visual Studio中启用“第一次机会异常捕获”,可以更好地了解问题,因此,您可以在CRT代码中看到生成异常的行和(单步执行)捕获异常的异常处理程序。您是否考虑过更好的解决方案:不要将无效参数传递给库函数-|嘿您是如何查找错误代码的?visual studio中的“错误查找”对我没有帮助。似乎此处理程序让我进行日志记录,但不允许我从失败中恢复:(我说得太快了。当这个处理程序被“设置”时,它会导致fgetpos返回错误代码,而不是导致我的整个应用程序崩溃。好吧,我想我得到了我想要的-即使它比我想要的更奇怪。嘿!!!你是如何查找错误代码的?错误查找)在visual studio中,我没有这样做。似乎这个处理程序让我做日志记录,但不允许我从失败中恢复。:(我说得太早了。当这个处理程序被“设置”时,它会导致fgetpos返回错误代码,而不是导致我的整个应用程序崩溃。好吧,我想我得到了我想要的-即使它比我想的更奇怪。