如何处理catch块中的异常?

时间:2016-11-17 06:00:44

标签: c# oop exception-handling try-catch

我正在尝试获得处理异常的理想方法。我google了&请注意,我应该将try 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");
        }

在谷歌上搜索我读到它应该装饰如下:

  

如果我这样做,那么它将陷入无限try-catch块。

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

3 个答案:

答案 0 :(得分:3)

  

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

在这方面没有意图,但简单地说,不要让异常首先发生。

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);
    }
}

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

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

如果异常处理程序中发生错误(可能并且确实发生了某种情况),您需要了解这一点并知道在这种情况下会发生什么。

如果C#应用程序使用.NET框架,异常中抛出的异常只会导致应用程序与内部异常堆栈跟踪崩溃(相对于可能与实际异常更相关的“外部”异常) )如果不处理。

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

希望可以提供帮助。

答案 1 :(得分:2)

首先,您需要知道尝试,捕获和最终工作的内容让我们开始:

  1. 尝试:在这个块中,我们可以编写可能会产生错误的代码(更好的做法是在其中编写代码部分。)

  2. Catch:它有责任显示错误以及如果出现错误该怎么办(比如你的代码10/0会抛出错误,可以在本节中处理。)

  3. 最后:本部分编写的代码将执行任何错误天气如何进入。

  4. 现在对于你的查询,你最好能在最后使用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 :(得分:0)

我会赞同Tieson T.的评论。从我的角度来看,这是一个设计问题。

我还可以使用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   
        }
    }

希望有所帮助。