try-catch - В чем разница между двумя вызовами функций в одной попытке и их разделением в непрерывных попытках? - PullRequest
0 голосов
/ 30 марта 2020

В чем разница между двумя вызовами функций в одной попытке и их разделением в непрерывных случаях попытки? 1001 *

Я склонен иметь только одну вещь внутри, но я видел много кодов, имеющих 3, 10, 20, ... строк кода внутри одной попытки. Это не имеет смысла для меня, потому что если есть потенциальный риск в определенной строке кода c (например, вызов функции), я бы сосредоточился на этой строке, подразумевая, что "try" ставится только вокруг этой самой строки и не более .

Так что же говорят эксперты?

// Code ref #: 1
try
{
    baz();
    qux();
} 
...

или вы бы поступили следующим образом?

// Code ref #: 2
try
{
    baz();
} 
...

try
{
    qux();
} 
...    

Хорошо, я думаю, это на самом деле зависит от рассматриваемой обработки То есть, если я хочу обрабатывать любую ошибку одинаково или по-разному!?

Большое спасибо!

1 Ответ

1 голос
/ 30 марта 2020

Спросить, сколько утверждений вы должны поместить в try, все равно, что спросить, сколько утверждений вы должны добавить в if или for l oop. Почему вы никогда не спрашивали «сколько утверждений я должен добавить в if заявление?»? Потому что вы понимаете, что такое выражение if и что число утверждений в нем не имеет значения *. Что имеет значение, «какие заявления имеют смысл, когда помещены туда?» Таким образом, вместо этого вы, вероятно, спросите: « Что я могу поместить в if?».

Приведенный выше абзац перестал иметь смысл после редактирования вопроса OP, но это прекрасно!

То, что вы, кажется, не понимаете, это то, почему мы иногда помещаем много строк кода в try. Хорошо, один пример этого - когда вы читаете файл JSON. Вы бы сделали что-то вроде этого (очень грубый пример, только для иллюстрации):

try {
    string json = ReadFile();
    MyObject obj = ParseJSON(json);
    DoSomethingWithMyObject(obj);
} catch (FileNotFoundException ex) {
    ShowErrorToUser("File Not Found");
} catch (JsonReaderException ex) {
    ShowErrorToUser("Invalid File");
}

ReadFile может выдать FileNotFoundException, а ParseJSON может выдать JsonReaderException. Вы не можете разделить эти три строки на 2 try с:

string json;
MyObject obj;
try {
    json = ReadFile();
} catch (FileNotFoundException ex) {
    ShowErrorToUser("File Not Found");
}
try {
    obj = ParseJSON(json);
} catch (JsonReaderException ex) {
    ShowErrorToUser("Invalid File");
}
DoSomethingWithMyObject(obj);

Почему? Потому что определенные правила присваивания говорят, что json и obj точно не назначаются при их использовании! Видите ли, даже если ReadFile не удастся, ParseJSON все равно будет выполняться, но json не будет иметь значения, если ReadFile не удастся!

Если вы скажете "хорошо, я могу просто дать json значение по умолчанию! ", это правда, но это не всегда имеет смысл делать. Иногда одна часть вашего метода просто не может работать, если другая часть выдает исключение. Это признак того, что две части должны быть в одном try блоке # .


* Что ж, это важно, если вы говорить о стиле ...

# Очевидно, что если ваш метод не может обработать исключение, тогда вообще не должно быть блока try.

...