Есть исключения - PullRequest
       5

Есть исключения

6 голосов
/ 20 октября 2010

Время от времени я анализирую файл, содержащий данные MalFormed.

и это исключение,

Я хотел бы восстановиться после исключения и игнорировать неверно отформатированные данные.

Какой лучший способ сделать это?

try{
// parse file
}catch(Exception){
//eat it.
}

* РЕДАКТИРОВАТЬ: * Я думаю, мой вопрос не был хорошо понят. Я хотел бы восстановиться после исключения, любого исключения в этом отношении, я не хочу, чтобы моя программа остановилась. но продолжить.

Ответы [ 8 ]

7 голосов
/ 20 октября 2010

Я думаю, что вы спрашиваете так:

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

using System;
using System.IO;
using System.Windows.Forms;

public void ParseFile(string filepath)
{
    TextReader reader = null;

    try
    {
        reader = new StreamReader(filepath);

        string line = reader.ReadLine();
        while (!string.IsNullOrEmpty(line))
        {
            try
            {
                // parse line here; if line is malformed, 
                // general exception will be caught and ignored
                // and we move on to the next line
            }
            catch (Exception)
            {
                // recommended to at least log the malformed 
                // line at this point
            }

            line = reader.ReadLine();
        }
    }
    catch (Exception ex)
    {
        throw new Exception("Exception when trying to open or parse file", ex);
    }
    finally
    {
        if (reader != null)
        {
            reader.Close();
            reader.Dispose();
        }
        reader = null;
    }
}

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

5 голосов
/ 20 октября 2010

Короче говоря, вы, вероятно, не должны использовать исключения для этого.Что-то вроде TryParse, который возвращает false, намного эффективнее и легче восстанавливается.Обработка исключений - немного тупой объектный подход.

Руководство MSDN по обработке исключений

3 голосов
/ 20 октября 2010

В общем, что-то вроде этого:

try
{
    // parse file
}
catch (FormatException)
{
    // handle the exception
}
finally
{
    // this block is always executed
}

Вам следует избегать отлова общего случая Exception и вместо этого отлавливать конкретное исключение, каким бы оно ни было.

2 голосов
/ 20 октября 2010

Здесь есть хорошая справочная информация: Есть ли веская причина игнорировать пойманную исключительную ситуацию

Краткий ответ: исключения являются дорогостоящими в использовании таким образом. Если это вообще возможно, проверьте входные данные перед отправкой на обработку и выполните их игнорирование, а не исключения.

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

1 голос
/ 20 октября 2010

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

Тем не менее, обнаружение общего исключения является отличной идеей, если вы намеренно хотите / хотите перехватить все возможные ошибки и продолжить работу.Это может произойти, если обработка для всех типов ошибок одинакова (например, «если по какой-либо причине я не могу прочитать это значение предпочтения, я верну значение по умолчанию 5» - это бесконечно лучше, чем сбой вашей программы, потому что вы не сделали »не понимаю, что это может вызвать исключение из-за таймаута сети).При разумном использовании этот подход может сделать вашу программу пуленепробиваемой, но при неправильном использовании вы можете устранить ошибки, о которых вам нужно знать и исправить, и это может быть очень болезненным.всегда тщательно продумывайте сообщения об ошибках - должны ли вы сообщить пользователю, что у вас возникла проблема?Следует ли регистрировать его в файле трассировки, чтобы, когда клиент жалуется на то, что что-то не работает должным образом, вы можете отследить источник проблемы?Или вы должны молча игнорировать это?Просто будьте осторожны, поскольку чрезмерное усердие в подавлении может очень затруднить понимание того, почему программа ведет себя непредсказуемо.

0 голосов
/ 20 октября 2010

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

Прежде чем мы решим, что лучше, дайте нам больше деталей:)

0 голосов
/ 20 октября 2010

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

0 голосов
/ 20 октября 2010
try{
   // parse file
   }
   catch(Exception){
     //eat it.
   }
   finally 
   {
      //cleanup  must ... release system resources here (e.g. stream.Close() etc)
      // code here always executes...even if the exception is unhandled

   }

// code will resume execution from this point onwards...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...