2016-11-17 136 views
0

我想获得处理异常的理想方法。我搜索了&,我应该把trycatch放在catch块中,以便处理,但是如果在嵌套块本身发生了什么异常。如何处理catch块中的异常?

try 
{ 

      int a = 10; 
      int b = 0; 

      int c = a/b; 

      Console.WriteLine(c); 
      Console.ReadKey(); 
     } 
     catch (Exception ex) 
     { 
      int a = 10; int b = 0; 
      int c = a/b; 
      Console.WriteLine(ex.Message.ToString()); 
      Console.ReadKey(); 
     } 
     finally 
     { 
      Console.WriteLine("Some Exception"); 
     } 

在google搜索,我读了它应该如下布置:

如果我这样做,那么它会卡在一个无限的try-catch块。

我认为会有一些更好或正确的方式来处理这种情况。

+1

在某些情况下,如果您的代码处于您的异常处理中发生异常的状态,您应该会发生崩溃。如果应用程序崩溃并不好,您需要考虑您的代码如何“纾困”,或中止造成问题的流程。 –

+0

我会与上面的评论。从我的视角来看,这是一个设计问题,而不是语言问题。我也可以用'if'语句构建上面的例子 - >如果出错了,我执行失败处理 - >如果失败处理出错,我执行失败处理,如果.... – Moerwald

+0

重要的是你学会了很很快发现异常处理是**糟糕的** _unless_您有一个特定的异常,您可以捕捉并且可以正确处理。如果你曾经写过'catch(Exception ...)',那么你可能会让你的生活变得更加艰难 - 不容易。 – Enigmativity

回答

2

首先你需要知道的是什么尝试,赶上最后的作品,让我们开始:

  1. 尝试:此块中,我们可以写一个不得不放弃一些错误的可能性代码(更好的做法是在写代码的一部分)

  2. 渔获:它负责显示错误,什么错误,如果出现做(就像在你的代码10/0抛出错误,可以在本节进行处理)

  3. 最后:代码写在thi部分将执行任何错误进入或不进行的天气。

现在为您的查询,它会更好,你可以使用If ... else在最后,代码放在该部分将保存在try catch块。

例如:

bool flagCatch=false; 
try 
{ 

    int a = 10; 
    int b = 0; 

    int c = a/b; 

    Console.WriteLine(c); 
    Console.ReadKey(); 
} 
catch (Exception ex) 
{ 
    //Error handling 
    flagCatch=true; 
    Console.WriteLine(ex.Message.ToString()); 
    Console.ReadKey(); 
} 
finally 
{ 
    try 
    { 
     if(flagCatch) 
     { 
      //Code 
     } 
     else 
     { 
      //Code when error not comes 
     } 
    } 
    catch(Exception err) 
    { 
     //Error handling 
    } 
} 
2

我认为会有一些更好的或处理这种情况的正确方法。

没有snark打算在这个,但简单地说,不要让例外发生在第一位。

A try...catch是一种语言结构,可以确保您处理边缘案例或您并未缓解和设计的错误,因此它为什么是特殊的代码。

在您的代码中,由于除数为0,您只是抛出一个错误,但在现实世界中,您希望处理该错误并提醒用户(或开发人员,服务器或其他人),并且然后处理实际的特殊代码,例如:

static void PrintError() 
{ 
    Console.WriteLine("You must enter a valid number between {0} and {1}, excluding 0", int.MaxValue, int.MinValue); 
} 

static void Main(string[] args) 
{ 
    try { 
     int a = 10; 
     int b = 0; 
     PrintError(); // Tell user to enter valid numbers 
     while (b == 0) { 
      string user_input = Console.ReadLine(); 
      if (int.TryParse(user_input, out b)) { // is it an actual number? 
       if (b == 0) { // no 0's remember user!?? 
        PrintError(); 
       } else { 
        // ok, everything checks out, so do what the system can actually handle without throwing an error 
        Console.WriteLine("a/b = {0}", (a/b)); 
       } 
      } else { 
       PrintError(); 
      } 
     } 
    } catch (Exception ex) { 
     Console.WriteLine("Something exceptional happened: {0}", ex); 
    } 
} 

这个例子可以进一步简化,但它表明没有可能除了一些实际发生的异常,实际上是例外(即内存不足的错误或一些其他系统错误)。

如果代码库中有多个类,那么异常处理程序和终结器就是您可以清理代码其他区域中获取的资源的位置,如关闭套接字或文件句柄以确保数据不会丢失。

如果在异常处理程序中发生错误(可能发生的事情),您需要知道这一点,并知道在这种情况下可能发生的情况。

在使用.NET框架的C#应用​​程序中,异常中引发的异常将导致应用程序与内部异常堆栈跟踪(相对于可能与实际更相关的“外部”异常例外)。

有很多“错误”的方式来处理异常(比如根本不处理它们),但鉴于异常的可变性质,并没有真正的“正确”方式。

希望能有所帮助。

0

我会去评论泰森吨。从我的角度来看,这是一个设计问题。

我也可以用if语句建立一个例子 - >如果出了问题,我进行故障处理 - >如果故障处理不顺心,我进行故障处理,如果故障处理出错....

为了使代码更易读,你可以尝试“隐藏” try-catch块的方法,如:

static void PerformInTryCatch<T, TException>(Action<T> action, T obj) where TException : Exception 
    { 
     try 
     { 
      action(obj); 
     } 
     catch (TException exception) 
     { 
      // Perform some logging 
     } 
    } 

希望有所帮助。