仅包括参数用于内部函数中的异常报告

时间:2010-11-16 11:53:40

标签: c# .net exception-handling parameter-passing

CreateDocument(string templatePath)
{
    Document doc = OpenDocument(templatePath);
    Picture pic = GetLogo();
    AddLogo(doc, pic, templatePath);
}

AddLogo(Document doc, Picture logo, string templatePath)
{
    Picture placeholder = doc.FindLogoPlaceholder();
    if (placeholder.Size != logo.Size)
    {
        throw new ApplicationException(
            String.Format("Invalid template {0}, logo size: {1}, required: {2}",
                 templatePath, placeholder.Size, logo.Size
            ));
    }
}

考虑上面的代码作为我刚刚编写的一个例子。

请注意,将templatePath传递给AddLogo方法的唯一原因是为了促进异常生成。

我今天的代码中有一些东西需要我这样做,这对我来说感觉真的很难闻。但我对异常处理模式并不太熟悉,我真的没有看到更好的方法。

我想知道你的想法是什么,以及是否有更好的模式来处理这样的情况。

3 个答案:

答案 0 :(得分:5)

在更高级别创建例外:

CreateDocument(string templatePath)
{
    Document doc = OpenDocument(templatePath);
    Picture pic = GetLogo();
    try {
        AddLogo(doc, pic);
    } catch (InvalidLogoSize e) {
        throw new ApplicationException(
            String.Format("Invalid template {0}, logo size: {1}, required: {2}",
                 templatePath, e.pSize, e.lSize
            ));
    }
}

AddLogo(Document doc, Picture logo)
{
    Picture placeholder = doc.FindLogoPlaceholder();
    if (placeholder.Size != logo.Size)
    {
        throw new InvalidLogoSizeException(placeholder.Size, logo.Size);
    }
}

答案 1 :(得分:1)

您通常会抛出异常,然后在可以添加更多信息的任何层捕获它,将其包装在新的异常中并抛出该异常。

答案 2 :(得分:1)

该函数的调用者可以使用其他信息进行重新抛出:

CreateDocument(string templatePath) 
{ 
    Document doc = OpenDocument(templatePath); 
    Picture pic = GetLogo(); 
    try
    {
        AddLogo(doc, pic);
    }
    catch(Excpetion e)
    {
        throw new ApplicationException( templatePath, e);
    }
}