2013-02-19 4 views
0

я пытаюсь обрабатывать исключения и сохранить это исключение в базе данныхКак обрабатывать исключения в .net

Function1() 
{ 
    try 
    { 
     for(int i=0;i<dt.rows.count;i++) 
     { 
      Function2(); 
     } 
    } 
    catch(exception ex) 
    { 
     saveInDB(ex.message.tostring(),id); 
    } 

} 

Function2() 
{ 
    try 
    { 
     function3() 
    } 
    catch(exception ex) 
    { 
     throw ex; 
    } 
} 

Function3() 
{ 
    try 
    { 
     function4() 
    } 
    catch(exception ex) 
    { 
     throw ex; 
    } 
} 

Function4() 
{ 
    try 
    { 
     code; 
    } 
    catch(exception ex) 
    { 
     throw ex; 
    } 
} 

Предположим, я получил исключение в method4 тогда он будет бросать его в function3-> Function2-> function1 и то функция1 будет писать исключение в базе данных.

но после записи исключения в БД я хочу продолжить цикл.

так как я должен делать?

+0

Почему у вас есть функция, которая запускает другую функцию? – Vloxxity

ответ

1

, но после записи исключения в БД я хочу продолжить цикл

Это возможно только положив (за дополнительную плату) попытаться/поймать внутри для цикла. Вы должны сделать это только в том случае, если следующий раунд цикла является независимым, и вы уверены, что для вашей системы нет вреда.

Задайте себе вопрос: после неизвестной ошибки я все еще смею писать бизнес-данные в базу данных?

Обратите внимание, что ваш код является нарушением некоторых передовых методов:

  • throw ex; сбрасывает стек-следа. Замените его throw;
  • , когда блоки catch в функции function2 - function4 ничего не делают с исключениями, полностью удалите try/catch.
0

Пока какой-либо блок try-catch генерирует исключение, программа не может продолжить. Если вы хотите, чтобы ваша программа была продолжена после обработки исключений, мое предложение было бы не использовать:

throw ex; 
1

Вы можете положить ваши try - catch в тело for передачи контура в:

Function1() 
{ 
    for(int i=0;i<dt.rows.count;i++) 
    { 
     try 
     { 
      Function2(); 
     } 
     catch(Exception ex) 
     { 
      saveInDB(ex.message.tostring(),id); 
     } 
    } 
} 

Хранить в Разумеется, что IO, например, сохранение в БД, может быть довольно ненадежным (и медленным). Это, в свою очередь, может привести к тому, что в вашем catch будет выброшено еще одно исключение, которое срывает ваш цикл.

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

Function1() 
{ 
    var errors = new LinkedList<Exception>(); 
    for(int i=0;i<dt.rows.count;i++) 
    { 
     try 
     { 
      Function2(); 
     } 
     catch(Exception ex) 
     { 
      errors.AddLast(ex); 
     } 
    } 
    if(errors.Count > 0) 
    {   
     // now you got all exception in errors and can dump 
     // them in one block 
    } 
} 
+0

Спасибо, что работает –

+0

@TruptiGhorpade Приятно читать; вы могли бы принять ответ или опубликовать решение своей проблемы? –

+0

Я не уверен, что я бы сделал вторую часть и добавлю их в список. Но было бы лучше всего поймать его, если вы справитесь с этим. Также для ведения журнала я бы рекомендовал этот oss-проект, над которым я работаю: https://github.com/exceptionless/Exceptionless. Он протестирован и свободен. –

0

Если вам нужно продолжать цикл после исключения внутри цикла, вам нужно добавить try/catch блок within the loop, как показано ниже;

try{ 

    for(int i=0; i<10; i++){ 
     try{ 
     //do your work here 
     } 
     catch (Exception e){ 
     //write to db here and then it will continue in the for loop 
     } 
    } 

    //rest of the code 
} 
catch (Exception ex){ 
    //write to db 
} 
+0

Спасибо, что работает –

Смежные вопросы