Разница между блоком catch и броском нового исключения в методе - PullRequest
2 голосов
/ 12 декабря 2008

В методе я хочу иметь возможность вставлять значение в 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.
}

OR

public void ParseDocument
{
    //Logic here...

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

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

Спасибо

Ответы [ 5 ]

2 голосов
/ 12 декабря 2008

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

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

Когда выдается исключение

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

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

EDIT:

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

Примечание: Не оптимизируйте без необходимости.

1 голос
/ 12 декабря 2008

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

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

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

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

0 голосов
/ 12 декабря 2008

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

0 голосов
/ 12 декабря 2008

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

0 голосов
/ 12 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...