将异常传递给下一个处理程序而不传播?

时间:2014-01-15 17:56:17

标签: c# exception

假设我有这个应用程序:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            throw new SomeSpecificException("testing");
        }
        catch (SomeSpecificException ex)
        {
            Console.WriteLine("Caught SomeSpecificException");
            throw new Exception("testing");
        } 
        catch (Exception ex)
        {
            Console.WriteLine("Caught Exception");
        }
        Console.ReadKey();
    }
}

// just for StackOverflow demo purposes
internal class SomeSpecificException : Exception
{
    public SomeSpecificException(string message) : base(message)
    { }

    public SomeSpecificException()
    { }
}

我所需的输出如下:

Caught SomeSpecificException
Caught Exception

有办法做到这一点吗?或者我的设计完全偏离基础?

背景:

我正在向现有代码库添加代码。代码库捕获异常(通用异常)并执行一些日志记录,删除文件等。但我有一个独特的行为,我只想在抛出SomeSpecificException时发生。之后,我希望将异常处理传递给现有的Exception catch子句,这样我就不必修改太多的现有代码。

我知道使用反射或其他一些运行时技术检查异常的类型,并按照Catch Multiple Exceptions at Once在异常捕获子句中放置if语句,但我希望得到关于上述方法是否可行的反馈。 / p>

4 个答案:

答案 0 :(得分:4)

您需要使用两个try块:

try {
    try {
        throw ...;
    } catch(SpecificException) {
        // Handle
        throw;
    }
} catch(Exception) {
    // Handle
}

答案 1 :(得分:0)

您的方法无效。您可以做的最好的事情是将两个处理程序之间共同的代码提取到一个方法中,并让它们都调用常用方法。

    try
    {
        throw new SomeSpecificException("testing");
    }
    catch (SomeSpecificException ex)
    {
        Console.WriteLine("Caught SomeSpecificException");
        CommonHandling();
    } 
    catch (Exception ex)
    {
        CommonHandling();
    }

private void CommonHandling() {
    Console.WriteLine("Caught Exception");
}

答案 2 :(得分:0)

试试这个:

    try
    {
        try 
        {
            throw new InvalidCastException("testing");
        }
        catch (SomeSpecificException ex)
        {
            Console.WriteLine("Caught SomeSpecificException");
            throw new Exception("testing");
        } 
    }
    catch (Exception ex)
    {
        Console.WriteLine("Caught Exception");
    }
    Console.ReadKey();

这应避免更改现有代码。您只是在现有的内部直接添加额外的尝试。

答案 3 :(得分:0)

如果你真的希望它能够工作,我想你可以用switch语句

    try
    {
        throw new InvalidCastException("testing");
    }
    catch (Exception ex)
    {
        switch(ex.GetType())
        {
        case "SomeSpecificException":
            Console.WriteLine("Caught SomeSpecificException");
            goto default; //if I recall correctly, you need a goto to fall through a switch in c#
            break;
        default:
            Console.WriteLine("Caught Exception");
    }
    Console.ReadKey();