Разница между блоком catch и генерацией нового исключения в методе

В методе я хочу иметь возможность вставлять значение в div, который является частью HTML-документа, который я выбрал для анализа.

public void AddToDiv(string div)
{
    //Code to read the html document and look for the div 
    //(name specified as the parameter of this method).
} 

Вопрос в том, что я мог бы указать div с именем "abc", но HTML-документ может не иметь этого div. Справедливо, но какая разница между мной, говоря:

try
{
    //Method logic to parse document for the div
}
catch(ArgumentException ex)
{
    // (I wouldn't supress this catch block in production code, 
    // just omitting body details for simplicity.
}

ИЛИ

public void ParseDocument
{
    //Logic here...

    if(!document.Contains(div)
    {
    throw new ArgumentException();
    }
}

Короче говоря, в чем разница между блоком catch и поговоркой throw new [ExceptionType here] в главном логическом блоке? Как мне решить, что использовать?

Спасибо

12.12.2008 17:22:51
5 ОТВЕТОВ
РЕШЕНИЕ

Лично я бы проверил существование, вместо того, чтобы создавать исключение, легче определить поток логики и лучше соответствовать целям вашего кода.

Смотрите эти вопросы и ответы для более широкого обсуждения

Когда бросить исключение

Есть ли веская причина игнорировать пойманное исключение?

Насколько медленны исключения .net?

РЕДАКТИРОВАТЬ:

Поразмыслив, стоит подумать о расходах на проверку «содержит». Если это может быть так же дорого, как на самом деле получение div, и это удваивает время, затрачиваемое на выполнение подпрограммы, и если это отставание ухудшает производительность до такой степени, что это будет замечено , то, возможно, лучше просто пойти и получить дела. Я все еще поймал бы это и бросил бы ArgumentException, с оригинальным исключением как внутреннее исключение.

NB: Не оптимизируйте, если вам не нужно.

2
23.05.2017 10:27:52

бросание и отлов - две противоположные стороны обработки исключений. Компонент, который сталкивается с аварией и не может восстановиться после нее, выдает исключение. Где-то внизу стека вызывающий компонент может перехватить исключение и обработать его.

Разница в том, что в этом случае шаблон AddToDiv будет генерировать исключение, а ParseDocument, который вызывает AddToDiv, может его перехватить и обработать.

0
12.12.2008 17:30:50

хорошо, Try / Catch дороже, и его следует использовать для обработки непредвиденных ошибок. В этом случае вы знаете, что, возможно, получите ошибку, и вам не придется «пробовать»

0
12.12.2008 17:34:58

Есть третий вариант, но об этом я напишу позже.

Прежде всего, перехват исключений - это все, что нужно для обнаружения ошибок, которые вы не ожидаете, обработки их и продолжения или постепенного закрытия.

Бросать исключения следует использовать, когда вы сталкиваетесь с ситуацией, которая не должна возникать или должна быть обработана в другом месте. Если вы хотите обработать эту ошибку за пределами вашего метода, это может быть вашим решением.

Третий вариант - фактически избежать ошибок, которые, как вы знаете, могут возникнуть. Например, вы можете проверить, существует ли div, и ничего не делать, если он не существует, также известный как защитное программирование.

1
12.12.2008 17:48:36

Вопрос в следующем: если ParseDocument (...) не может делать то, что вы от него хотите, должен ли он работать молча? Если это так, используйте try {} catch {} внутри него. Если вам нужно, чтобы вызывающий код знал, что ParseDocument не удалось, он должен выдать исключение, которое может вызвать этот вызывающий код.

0
12.12.2008 17:50:49