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
方法的唯一原因是为了促进异常生成。
我今天的代码中有一些东西需要我这样做,这对我来说感觉真的很难闻。但我对异常处理模式并不太熟悉,我真的没有看到更好的方法。
我想知道你的想法是什么,以及是否有更好的模式来处理这样的情况。
答案 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);
}
}