Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#如何捕获异常并恢复执行_C#_Exception - Fatal编程技术网

c#如何捕获异常并恢复执行

c#如何捕获异常并恢复执行,c#,exception,C#,Exception,你好 我编写了简单的控制台程序。它有func Main()和类适配器 解释其工作原理的一些简单代码: void Main() { try { Work(array); //subcribing at some events; Application.Run(); } catch(Exception ex) { //write to log; } } class Adapter {

你好

我编写了简单的控制台程序。它有func Main()和类适配器

解释其工作原理的一些简单代码:

void Main()
{
    try
    {
        Work(array);
        //subcribing at some events;
        Application.Run();  
    }
    catch(Exception ex)
    {
        //write to log;
    }
}
class Adapter
{
    ....
    public void GetSomething()
    {
        try
        {
            ...some work and exception goes here;
        }
        catch(Exception ex)
        {
            //catch exception and do Work:
            Work(array);
        }
    }
}
当异常发生时,它在GetSomething上捕获。所以,我写了一些值。但是我需要程序在异常后仍然运行。 但在GetSomething方法中捕获后,它转到Main func的异常ex,程序退出

如何在GetSomething方法中捕获异常后,程序仍将运行?
谢谢大家!

您可以使用try、catch和finally:


这种行为在.NET中是不可能的。当抛出异常时,控件退出当前点并继续执行它可以在调用堆栈中找到的第一条
catch
语句,或者退出程序,从而消除调用堆栈直到该点的执行。这是异常行为定义的一部分

相反,您可以通过
工作
分解正在完成的过程,一次处理一项,以实现与您要求的相同效果。换句话说,不要使用
工作(数组)
,而是尝试

foreach(var item in array)
{
    try { WorkSingle(item); }
    catch { continue; }
}

如果您想要捕获一个异常并在失败点(可能是调用堆栈中的几层)继续执行,并且可能重试失败的语句,那么您就太不走运了

一旦调用了
catch
子句,堆栈就一直展开到该点。您可以用某种方式处理异常,然后选择零或其中一个

  • 通过
    抛出继续异常
  • 通过
    throw e重新抛出异常
  • 通过
    throw new SomeException()抛出新异常
如果未选择上述选项之一,则在
try/catch/finally
块后面的点继续执行。例如:

    try
    {
      DoSomethingThatMightThrowAnException() ;
    }
    catch ( Exception e )
    {

      DoSomethingToHandleTheExceptionHere() ;

      // Then, choose zero or one of the following:
      throw                  ; // current exception is continue with original stack trace
      throw e                ; // current exception is re-thrown with new stack trace originating here
      throw new Exception()  ; // a new exception is thrown with its stack trace originating here
      throw new Exception(e) ; // a new exception is thrown as above, with the original exception as the inner exception

    }
    finally
    {
       // regardless of whether or not an exception was thrown,
       // code in the finally block is always executed after the try
       // (and the catch block, if it was invoked)
    }

    // if you didn't throw, execution continues at this point.
如果不执行上述操作之一,则在
try/catch/finally
块后面的语句中继续执行

就重试而言,您所能做的最好的事情如下:

// retry operation at most 3
int number_of_retries = 5 ;
for ( int i = 0 ; i < number_of_retries ; ++i )
{
  try
  {

     DoSomethingThatMightThrowAnException() ;

     break ; // exit the loop on success

  }
  catch( Exception e )
  {

     Log.Error("well...that didn't work") ;

     ExecuteRecoveryCode() ;

  }

}
//最多重试3次操作
整数重试次数=5;
for(int i=0;i<重试次数;++i)
{
尝试
{
dosomething可能会引发异常();
break;//成功后退出循环
}
捕获(例外e)
{
Log.Error(“嗯……那不行”);
ExecuteCoveryCode();
}
}

程序仍在运行…除非您重新启动;这一例外情况得到了处理。您的问题还存在于其他地方,我认为程序不会像您认为的那样退出。也许您应该在异常中设置布尔值或int,然后移动
工作(数组)
method在此之外将其签名更改为返回布尔值或int,然后在运行后检查值..如果为真..则继续,或者如果int=some value>0,则继续。。这是因为。。?如果
Work
是一种方法,那么它看起来是什么样的。。?显示代码请从异常处理程序内部调用
Work()
可能是一个非常糟糕的主意。异常处理块应该只处理异常,它们不应该执行业务逻辑来响应该异常的状态。考虑如果在代码完全处理之前从异常处理块中抛出另一个异常会发生什么,原来的异常将丢失。只需在
catch
块中处理异常,不要将其视为执行进一步业务操作的
else
语句。