2014-02-03 3 views
2

У меня есть приложение, которое запускает большой цикл, где он читает данные, записывает в PDF-файлы и отправляет файлы по электронной почте одним движением. Иногда появляется ошибка, и я должен вернуться к тому, что вызвало ошибку. В основном весь цикл находится в блоке Try/Catch. Есть две петли, в основном (в псевдокоде):Как продолжить цикл после ошибки?

try 
    // Loop 1 
    process 1 
    // Loop 2 
    process 2 
catch 
    // Message box error 

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

+1

Попробуйте/поймайте внутри петли? – Plue

+0

Положите 'try catch' внутри LOOP2 – Jodrell

+1

Возможный дубликат [Продолжить цикл итерации цикла после исключения] (http://stackoverflow.com/questions/16818532/continue-loop-iteration-after-exception-is-rown) – kei

ответ

4

Не используйте try..catch в качестве панацеи вне рамок. Удалите это оттуда и положите его вокруг тех инструкций, которые, как вы знаете, могут вызвать проблемы.

Чем крепче они, тем лучше. Вы тогда будете в состоянии справиться с этим делом, не нарушая из всего цикла или процедур:

for(...) 
{ 
    // procedural code 

    try { 
     // least possible problem code 

    } catch(Exception ex) { 
     // log/report error 1 
     // use continue/break to continue with next cycle or break out of the loop 
     Log.Message("Exception (in big loop #01): " + ex.Message); 
    } 

    // procedural code 

    try { 
     // least possible problem code 

    } catch(Exception ex) { 
     // log/report error 2 
     // use continue/break to continue with next cycle or break out of the loop 
     Log.Message("Exception (in big loop #02):" + ex.Message); 
    } 

    // procedural code 
} 

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

Для входа исключения вы необходимо реализовать Log класс таким образом:

using System.IO; 

public class Log 
{ 
    public static void Message(string message) 
    { 
     using (StreamWriter writer = File.AppendText("path_to_dir\\log.txt")) 
     { 
      writer.WriteLine(message); 
     } 
    } 
} 

Этот Log класс очень очень простой и может быть улучшена в следующих направлениях:

  • DON» t использовать статические методы
  • не использовать singleton, вставлять объект регистрации в функцию большого цикла
  • добавить время и дату в фронт каждой линии
  • добавить стандартного центра и тяжести (лучше всего, если взято из syslogd)
  • позволяют также отправить электронную почту, если степень тяжести находится выше порогового уровня
  • позволяет журнал прокатки в зависимости от времени, линия или размера файла
  • Что произойдет, если возникает исключение при регистрации исключения? мета-исключение !?
  • гораздо

Что я ставлю здесь просто чтобы дать вам представление об ошибке регистрации. Это довольно обширная область знаний.

5

Просто используйте другой try ... catch внутри цикла,

try 
    foreach() // Loop one 
    try 
     foreach() // Loop two 
    catch 
     // Log error, or ignore, then it continues loop 1  
catch 
    // Message box error 

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

+0

Вау. Я никогда не думал, что так делаю ... так просто. –

2

Может быть, так?

// Loop 1 
    try 
    process 1 
    // Loop 2 
     process 2 
    catch 
    // Message box error 

Это зависит от того, что именно вы хотите. Какие ошибки вы хотите игнорировать, те, которые происходят от PROCESS ONE, PROCESS TWO или обоих? Псевдокод выше проигнорирует все ошибки и продолжит внешний цикл 1.

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