如何在不扔的情况下捕获异常

时间:2014-03-20 05:19:28

标签: c++

由于一些异常,Function()中存在CRASH,因此不会调用throw X.在这种情况下如何调用catch块来处理异常? 注意:我们无法修改Function()定义中的代码

示例代码:

 cout << "Before try \n";
      try {
          abc->Function();  //Here is CRASH

              throw x;
              cout << "After throw (Never executed) \n";

      }
      catch (...) {
          cout << "Exception Caught \n";
      }

      cout << "After catch (Will be executed) \n";

所以有人可以帮我解决这个问题吗?

5 个答案:

答案 0 :(得分:3)

“CRASH”也不例外。它是Undefined Behaviour。绝对可能发生任何事情。你很幸运,系统检测到它。它可以将您的磁盘或召唤后的守护进程格式化。相反,系统只是关闭过程以防止进一步损坏。

系统可能甚至可以让您定义要执行的操作,而不是关闭进程。定义它的方法是系统特定的。在Unix中,您需要install signal handleradvanced way),在Windows中使用structural exceptions

但问题是如果函数崩溃了,就没有办法告诉它进程的内存有多大的混乱。你真的必须修复崩溃。崩溃总是一个错误。

崩溃在该函数内部的事实并不自动意味着该函数中存在错误。我见过的大多数崩溃发生在标准库函数中,但它们不是标准库中的错误。它们是由于错误地使用这些功能引起的,或者有时是在程序中更早地使用不同的东西。因为当你调用Undefined Behaviour时,没有告诉何时会导致崩溃。特别是当一些不相关的代码想要使用被覆盖的变量时,缓冲区溢出和对未初始化指针的写入往往会导致最终崩溃。

如果错误确实存在于该功能中并且您无法对其进行修改,则必须找到能够或找到更好的替代方案的人。因为否则程序无法正常工作。

答案 1 :(得分:1)

代码中的try块中有一个附加的'}'。不确定在输入代码或其他更高级别的块时是否出错。

当在catch(...){}块内抛出任何未处理的异常时,将执行try {}块。无论是直接在块下面还是在块中其他函数调用的深处抛出异常都无关紧要。

cout << "Before try \n";
try 
{
    abc->Function1();  //A potential for crash
    abc->Function2();  //Another potential for crash
    abc->Function3();  //Another potential for crash

    // Do some checks and throw an exception.
    throw x;
    cout << "After throw (Never executed) \n";
}
catch (...) 
{
   // This will catch all unhandled exceptions
   // within the try{} block. Those can be from
   // abc->Function1(), abc->Function2(), abc->Function3(),
   // or the throw x within the block itself.
   cout << "Exception Caught \n";
}

cout << "After catch (Will be executed) \n";

希望这有帮助。

答案 2 :(得分:0)

这里是try和catch的含义

try {
 //[if some ABC type exception occur inside this block,]              
}catch (ABC) {
 //[Then, Do the things inside this block.] 
}

所以 在abc->Function();流程中发生异常后,将直接跳转到catch块,然后在那里写下您需要做的事情。例如。

try {
  abc->Function();  //Here is CRASH
  throw x;
  cout << "After throw (Never executed) \n";
}catch (Exception ex) {
  cout << "Exception Caught \n";
  throw ex;
}

实际上throw x;在这里没有任何用处。因为如果你的abc->Function();工作正常,那么它会抛出异常。所以只需删除该行。

答案 3 :(得分:0)

你写的代码完全正确。编译器在查看throw命令时try{}中的每个位置都会转到catch(){},因此cout << "After throw (Never executed) \n";不会执行,然后是catch(){}之后的代码将执行

有关此案例的更多信息,请点击链接trycatch

答案 4 :(得分:-1)

如果你有例外,

abc->Function();  //Here is CRASH

您将进入catch(...)区块。

如果您使用的是Windows操作系统,那么对于操作系统生成的例外,您还需要使用__try/__catch