Включая параметры только для сообщения об исключениях во внутренних функциях - PullRequest
1 голос
/ 16 ноября 2010
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 ]

5 голосов
/ 16 ноября 2010

Создать исключение на более высоком уровне:

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 голос
/ 16 ноября 2010

Вызывающий функцию может поймать пересмотр с дополнительной информацией:

CreateDocument(string templatePath) 
{ 
    Document doc = OpenDocument(templatePath); 
    Picture pic = GetLogo(); 
    try
    {
        AddLogo(doc, pic);
    }
    catch(Excpetion e)
    {
        throw new ApplicationException( templatePath, e);
    }
} 
1 голос
/ 16 ноября 2010

Обычно вы выбрасываете исключение, затем ловите его на любом слое, где вы можете добавить дополнительную информацию, оборачиваете его в новое исключение и выбрасываете его.

...