2012-05-30 2 views
12

У меня есть вопрос, который может показаться довольно простым (конечно, если вы знаете ответ).C# try catch continue execute

Определенная функция У меня есть другая функция, но я хочу продолжить выполнение от вызывающего, даже если вызываемый вызывал исключение. Позвольте мне дать вам пример:

something function1() 
{ 
    try 
    { 
     //some code 
     int idNumber = function2(); 
     //other code that need to execute even if function2 fails 
     return something; 
    } 
    catch(Exception e) 
    {//... perhaps something here} 
} 

EDIT: function1 также имеет обратный оператор так, ничего на самом деле может аварии на дороге

В function2 мне нужно делать вещи, но мне нужно только войти если что-то не удается, например:

int function2() 
{ 
    try 
    { 
     //dostuff 
    } 
    catch(Exception e) 
    { 
     //Log stuff to db 
    } 
} 

нормально, теперь мой вопрос в том, что я должен делать, если я хочу, чтобы продолжить выполнение в function1, даже если функция 2 выдает ошибку?

Иногда я смешиваю, если я должен делать бросок; или выбросить e; или не бросать ничего на всех (поймать блока, оставьте поле пустым)

+3

Ничего. Поскольку вы обработали исключения в функции2, если вы не ревертируете внутри catch2 функции2 (...) – Indy9000

ответ

13

Оставив блокирующий блок пустым, следует сделать трюк. Это почти всегда плохая идея. С одной стороны, есть штраф за исполнение, а с другой (и это более важно), вы всегда хотите знать, когда есть ошибка.

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

Там являются, если вы простите за каламбур, исключения к «правилу», хотя. Например, если функция2 должна была вызвать веб-службу, результаты которой на самом деле не нужны для вашей страницы, такой тип шаблона может быть в порядке. Хотя почти в 100% случаев вы должны, по крайней мере, регистрировать его где-то. В этом случае я зарегистрировал его в блоке finally и сообщит, вернулась ли служба. Помните, что данные, подобные тем, которые не могут быть ценными для вас, теперь могут стать ценными позже!

Последнее редактирование (возможно):

В комментарии я предложил вам поставить попробовать/поймать внутри function2. Просто подумал, что я уточню. Function2 будет выглядеть так:

public Something? function2() 
{ 
    try 
    { 
     //all of your function goes here 
     return anActualObjectOfTypeSomething; 
    } 
    catch(Exception ex) 
    { 
     //logging goes here 
     return null; 
    } 
} 

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

+0

Да, я начинал склоняться к чему-то другому, сначала я хотел сделать stackoverflow. Но теперь, когда вы упомянули об этом, я думаю, мне, возможно, придется переосмыслить мой код :) – gardarvalur

+0

возможно так! есть исключения из правила, хотя ... прочитайте мое последнее редактирование –

+0

Это хороший совет, я должен регистрировать эти вещи независимо от того, что. Любая собранная информация может, конечно, быть хороша со временем :) Проблема в том, что функция1() также должна возвращать оператор að, поэтому я могу принять ваш совет и переосмыслить свой код. – gardarvalur

1

просто сделать это

try 
    { 
     //some code 
    try 
    { 
      int idNumber = function2(); 

    } 
    finally 
    { 
     do stuff here.... 
    } 
    } 
    catch(Exception e) 
    {//... perhaps something here} 

Для всех намерений и целей, наконец, блок будет всегда выполняться. Теперь есть несколько исключений, где это фактически не выполняется: задача убивает программу, и есть быстрое исключение безопасности, которое мгновенно уничтожает приложение. Кроме этого, исключение будет выбрано в функции 2, блок finally выполнит необходимый код и затем поймает исключение во внешнем блоке catch.

+0

, не будет ли это просто работать на функции2() и пропустить // другой код, который необходимо выполнить? –

+0

fanally block whould execute после выполнения попытки и блокировки блоков – rcdmk

+0

hmm .... мои мысли точно. Но, наконец, блок должен покрыть остальные. Для всех целей мне нужно продолжить, хотя функция function2() не работает ... – gardarvalur

3

Или вы можете инкапсулировать логику цикла в try catch, например.

for(int i = function2(); i < 100 /*where 100 is the end or another function call to get the end*/; i = function2()){ 

    try{ 
    //ToDo 
    } 
    catch { continue; }  

} 

Или ...

try{ 
    for(int i = function2(); ; ;) { 
     try { i = function2(); return; } 
     finally { /*decide to break or not :P*/continue; } } 
} catch { /*failed on first try*/ } finally{ /*afterwardz*/ } 
+0

Как это ответить на вопрос? –

+0

прочитайте это !!!!!!!! – Jay

+0

Я пытаюсь понять, что означает 100.Вы имеете в виду, что 100 - это выход из цикла (или что-то, что я поставил вместо 100, чтобы выпрыгнуть)? – gardarvalur

7

Почему наклоняю вы используете, наконец, блок?

Как

try { 

} catch (Exception e) { 

    // THIS WILL EXECUTE IF THERE IS AN EXCEPTION IS THROWN IN THE TRY block 

} finally { 

// THIS WILL EXECUTE IRRESPECTIVE OF WHETHER AN EXCEPTION IS THROWN WITHIN THE TRY CATCH OR NOT 

} 

EDIT после вопрос редакции:

Вы можете сделать:

int? returnFromFunction2 = null; 
    try { 
     returnFromFunction2 = function2(); 
     return returnFromFunction2.value; 
     } catch (Exception e) { 

      // THIS WILL EXECUTE IF THERE IS AN EXCEPTION IS THROWN IN THE TRY block 

     } finally { 

     if (returnFromFunction2.HasValue) { // do something with value } 

     // THIS WILL EXECUTE IRRESPECTIVE OF WHETHER AN EXCEPTION IS THROWN WITHIN THE TRY CATCH OR NOT 

     } 
+0

Ну, потому что функция1() также должна возвращать другие вещи. Позвольте мне отредактировать мой пост, чтобы продемонстрировать :) – gardarvalur

+0

Я вижу, что вы там делали, это остроумно. Проблема, с которой я сталкиваюсь, заключается в том, что function1() также должен возвращать инструкцию, поэтому мне нужно продолжить после catch от функции2(), поскольку в конце блоков нельзя включать операторы return :) – gardarvalur

+0

вы можете вычислить оператор return в блоке finally и вернуть его после. Будет также выполняться материал после блока finally. – Yannis

0

ли вы имеете в виду вы хотите выполнить код в function1 независимо от того, бросил ли function2 исключение или не? Вы посмотрели на окончательный блок? http://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx

+0

Да, я отредактировал свой пост, мне нужно, чтобы функция1() также возвращала другое утверждение, поэтому я не могу обернуть оператор return в блоке finally (извините за то, что ранее не заявлял) – gardarvalur

0

В вашей второй функции удалите переменную e в блоке catch, затем добавьте throw.

Это перенесет генерируемое исключение на конечную функцию и выводит ее.

Его очень распространено, когда вы не хотите, чтобы код вашей бизнес-логики генерировал исключение, но ваш интерфейс.