Как поймать и игнорировать или обработать исключение при чтении данных из текстового файла построчно - PullRequest
2 голосов
/ 29 августа 2011

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

Ответы [ 10 ]

4 голосов
/ 29 августа 2011

Если я правильно понимаю, о чем вы просите, вот основная схема того, как может выглядеть ваш код:

using (StreamReader reader = File.OpenText("Path\to\your\file"))
{
    string line = null;
    while ((line = reader.ReadLine()) != null)
    {
        try
        {
            ProcessLine(line);
        }
        catch { /* Ignore exceptions */ }
    }
}

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

2 голосов
/ 29 августа 2011

Если вы действительно хотите «игнорировать» исключения, вы можете сделать что-то вроде:

try
{
    foo(); // Something that may throw an exception
}
catch
{
}

См. http://msdn.microsoft.com/en-us/library/0yd65esw(v=vs.80).aspx для получения дополнительной информации.

Но обычно, исключениеозначает, что случилось что-то плохое, и вы, вероятно, захотите как-то с этим справиться.

2 голосов
/ 29 августа 2011

См. Обработка исключений.http://msdn.microsoft.com/en-us/library/0yd65esw(v=vs.71).aspx

1 голос
/ 29 августа 2011

Трудно понять, чего вы хотите достичь, но вы, вероятно, просите что-то вроде этого:

while(condition)
{
    try {
        //process file line here
    }
    catch (Exception ex) {
        LogException(ex);
    }
}

Кстати, не очень хорошее дизайнерское решение. Избегайте этого, если можете.

1 голос
/ 29 августа 2011
try
{
//put the statement throwing the exception here
}
catch
{
//will eat the exception
}
//execution will continue here
0 голосов
/ 18 мая 2018

Вам нужно:

using System.IO;

, чтобы заставить это работать.


Вы можете попробовать:

try
{
    string path = ""; // You must add the path here. Else it won't work.
    string[] lines = File.ReadAllLines(path);
    foreach(string line in lines)
    {
        Console.WriteLine(line);
    }
} catch (Exception ex, IOException ioex) {
    // It's optional. You can remove "Exception ex, IOException ioex" if you want. You can delete the code below too.
    Console.WriteLine(ex.ToString());
    Console.WriteLine();
    Console.WriteLine(ioex.ToString());
} finally
{
    // in this "finally" section, you can place anything else. "finally" section isn't important, just shows that method has no exceptions.
    // you can add something else like: Console.WriteLine("Code has no exceptions. Great!");
}

Хорошо для продвинутых блокнотов.


РЕДАКТИРОВАТЬ : Если вам не нравится предыдущее решение, это может помочь вам.

string path = ""; // Again, path.
string[] lines = File.ReadAllLines(path);
foreach(string line in lines)
{
    try
    {
        Console.WriteLine(line);
    } catch(Exception ex, IOException ioex)
    { /* exception */ }
}

----- или -----

string path = Console.ReadLine();
int turns = 0;
int maxturns = (File.ReadAllLines(path)).Count();
while (turns < maxturns)
{
    try
    {
        Console.WriteLine(File.ReadLines(path).Skip(turns).Take(1).First());
    } catch (Exception ex, IOException ioex) { /* exception */ }
    turns++;
}
0 голосов
/ 29 августа 2011

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

  • Заключить строку с ошибкой в ​​пустой блок перехвата.Подождите, пока следующий сопровождающий сделает вам плохие вещи.

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

0 голосов
/ 29 августа 2011

Это не очень хороший подход. Вы должны быть активными и ловить определенные исключения, которые вы можете восстановить. Поймай их как можно ближе к месту, откуда их бросают. И пусть остальные всплывают и прекращают процесс. Поглотив все исключения, вы получите иллюзию надежности, хотя на самом деле ваш код может быть полон ошибок. Просто нет «быстрого и грязного» подхода к обработке исключений. Смотрите этот ответ .

Избегайте обработки ошибок, перехватывая неконкретные исключения, такие как System.Exception, System.SystemException и т. Д. В приложении код. Есть случаи, когда обработка ошибок в приложениях приемлемо, но такие случаи редки.

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

0 голосов
/ 29 августа 2011

Вам просто нужно обернуть ваш код обработки в блок try / catch.

 try
 {
     DoSomeProcessing(lineThatIreadFromFile);
 }
 catch
 {
    // Log or Ignore error here
 }

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

0 голосов
/ 29 августа 2011

Используйте try catch и зарегистрируйте ошибку . Ваш код будет выглядеть так:

try
{
   //read lines here
}
catch(Exception ex)
{
   //log the exception but don't throw anything.
}

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

Попробуйте поймать статью:

http://www.homeandlearn.co.uk/csharp/csharp_s5p6.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...