Try / Catch - вопрос "Стиль кода" - PullRequest
2 голосов
/ 21 сентября 2011

В общем, я хочу сделать код, который делает вызов функцией Execute класса, который может вызвать исключение.У меня вопрос, должен ли я установить класс и извлечь ли из него значения в пределах try / catch или out?

Вариант A:

neededValue V;

try
{
    MyClass C = new MyClass();
    C.SomeParam = XXX;
    C.Execute();
    V = C.SomeParam2;
}
catch
{
    //Clean up...
    //Log...
    //Throw new exception
}

Вариант B:

neededValue V;
MyClass C = new MyClass();
C.SomeParam = XXX;

try
{
    C.Execute();
}
catch
{
    //Clean up...
    //Log...
    //Throw new exception
}

V = C.SomeParam2;

Я знаю, что оба будут работать, но что лучше и легче читать?

Ответы [ 6 ]

11 голосов
/ 21 сентября 2011

эй, это НЕ одно и то же, в первом случае V = C.SomeParam2; никогда не будет выполнено в случае исключения, тогда как во втором случае оно всегда будет выполнено.

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

4 голосов
/ 21 сентября 2011

Я бы сказал, что вариант B легче читать и практичнее, потому что позже вы узнаете, что Execute может выдать и Exception.

Они не совпадают, в варианте B, если вы обрабатываете исключение, тогда вашТакже будет установлена ​​переменная B, и не только, если ваш Execute завершится успешно.

И вы должны всегда указывать в блоке catch, какое исключение вы перехватываете, чтобы вы могли обработать его и / или правильно его зарегистрировать.

2 голосов
/ 21 сентября 2011

Я бы сказал, вариант А более читабелен. И, конечно, как я бы сделал это особенно.

1 голос
/ 21 сентября 2011

Я думаю, вы должны включить в свой блок try весь код, связанный с небольшой задачей, которую вы пытаетесь выполнить. Однако иногда вам НУЖНО определить определенные переменные, прежде чем вы войдете в блок try. Например, вы всегда хотите определить InputStreams и OutputStreams перед блоком try, чтобы вы могли закрыть их в блоке finally.

1 голос
/ 21 сентября 2011

Ну, оба будут работать нормально

Но используйте второй, если хотите использовать MyClass объект вне блока try catch.

и

В первой области действия MyClass объект предназначен только для блока.

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

0 голосов
/ 21 сентября 2011

Это зависит в основном от одного вопроса.Вы хотите, чтобы V было присвоено значение C.SomeParam2, если метод Execute завершился неудачно и выдает исключение?

Если вы не хотите, чтобы он назначался при сбое, перейдите кA, если вы хотите, чтобы он был назначен независимо от того, как Execute получилось, перейдите к B.

...