来自不同地方的相同类型例外

时间:2015-04-27 20:02:46

标签: c# exception

假设您为不同格式的文件编写了两个不同的库。一个解析文件类型A,一个解析类型B.现在我看到大多数情况下大多数人说已经定义的例外(让我们说使用C#和.NET)足以处理大多数情况。在这种情况下,我认为在两种情况下,如果我们在解析时遇到一些问题,我们会抛出一个告诉我们格式不正确的InvalidDataException。当我们必须在更高级别的函数中捕获两个异常时会发生什么和他们在一起的东西?

void SomeHigherFunction()
{
    try
    {
        int x = GetSomeDataFromFileA();  // throws InvalidDataException
        int y = GetSomeDataFromFileB();  // throws InvalidDataException
    }
    catch(InvalidDataException)   // what failed ? 
    {
         ShowMessageWithWhatFileFailed()  // what display ?
    }
}

我们如何知道代码失败的位置?在这种情况下,是否应该定义两个不同的Exception类型,一个TypeAException和一个TypeBException,或者在这里我想念的是什么?我不想包装每个函数并返回一个包含结果的bool。在这种情况下,我将函数A包装在函数中,如果成功则返回true,并进一步执行B.但这显然是一个糟糕的设计和错误使用异常。我应该在这种情况下创建新类型吗?或者怎么样?

1 个答案:

答案 0 :(得分:0)

您可以使用Exception.Data Collection传递Exception的所有者,并进一步使用它。

我稍微重构了你的例子,但我认为这符合你的要求:

class Program
{
    [Serializable]
    public abstract class Parser
    {
        public int GetData()
        {
            bool error = true;
            if (error)
            {
                InvalidDataException exception = new InvalidDataException();
                exception.Data.Add("owner", this);
                throw exception;
            }
            return 0;
        }

        public abstract void handleError();
    }
    [Serializable]
    private class ParserA : Parser
    {
        public override void handleError()
        {
            Console.WriteLine("Handled in A");
        }
    }
    [Serializable]
    private class ParserB : Parser
    {
        public override void handleError()
        {
            Console.WriteLine("Handled in B");
        }
    }
    static void Main(String[] args)
    {
        try
        {
            int x = new ParserA().GetData();
            int y = new ParserB().GetData();
        }
        catch (InvalidDataException ex)
        {
            Parser parser = ex.Data["owner"] as Parser;
            if(parser != null)
                parser.handleError();

            // or even this if you prefer:
            if (parser is ParserA)
                Console.WriteLine("A");
        }
    }
}

在实际案例中,GetData方法是虚拟的,但你明白了