特殊异常处理

时间:2018-11-06 17:24:44

标签: c#

在这种情况下,是否有任何理由使用特定的实验类MyException1MyException2

public static void Main()
{
    try
    {
        TestMethod();
    }
    catch(Exception ex)
    {
        Console.Writeline(ex);
    }
}

private static void TestMethod()
{
    // This method can throw Exception1 and Exception2
}

public class MyException1 : Exception {}
public class MyException2 : Exception {}

我知道在每种异常类型都有多个catch块的情况下这是有意义的。但是在这种情况下,MyException1MyException2相似为空。这些引发的异常将在Main方法中强制转换为Exception类。也许最好不要用这种处理方法创建两个类似的Exception类?

3 个答案:

答案 0 :(得分:2)

catch块后面的概念是您 处理 。如果某种类型的异常需要某种类型的处理,则该异常具有自己的类时会很有帮助,因此它可以具有自己的catch块。

例如,如果MyException1致命时可以安全地吞下MyException2,则可以这样写:

    try
    {
        DoSomethingHard();
    }
    catch (MyException1 exception1)
    {
        _log.Write("Warning: small exception, no worries. {0}", exception1.Message);
        continue;
    }
    catch (MyException2 exception2)
    {
        _log.Write("Fatal: big exception, gotta bail out now. {0}", exception2.Message);
        break;
    }    

答案 1 :(得分:0)

例外应该广泛而不是深入。每个都有一个不同的例外,嗯...例外。

您的示例并未真正显示出很好的示例。也许更像是:

public static void Main()
{
    try
    {
        TestMethod();
    }
    catch(Exception ex)
    {
        Console.Writeline(ex);
    }
}

private static void TestMethod()
{
    if(..bad configuration)
        throw new ConfigurationException("configuration item");
    if(missing file)
        throw new FileMissingException("filename");
    // This method can throw Exception1 and Exception2
}

public class ConfigurationException : Exception {}
public class FileMissingException : Exception {}

答案 2 :(得分:0)

如果您使用的是ASP.NET,那么它是如此常见,以至于您创建并使用了自己的Exception处理程序,在这种情况下,您可以只考虑一种方法中每种异常的特定行为(而不是在每个容易出错的代码中捕获块)块),请看以下简单示例:

public class MyExceptionHandler : ExceptionHandler
{
    public override void Handle(ExceptionHandlerContext context)
    {
        if (context.Exception is SqlException)
        {
            //do something...
        }
        else if (context.Exception is HttpListenerException)
        {
            //do something...
        }
        else
        {
            //do something else...
        }
    }
}