Я пишу эту обработку исключений чисто? - PullRequest
3 голосов
/ 16 декабря 2011

Я понимаю, что есть несколько вопросов о передовых методах обработки исключений, но мне пришлось сделать несколько изменений на найденных примерах. Моей целью было избавиться от основных исключений, таких как «ArgumentException», «FileNotFoundException», «ArrayIndexOutOfBoundsException» и т. Д.

Если вы можете изобразить следующий код в иерархии. Таким образом, Process () вызывает ValidateData (), которая вызывает CSVData (). Я делаю в основном такие же вещи, , оборачивая все известные функции, включая мои, затем помещая это в исключение для метода и передавая его как внутреннее исключение. Это достойный способ выполнить эту задачу? Это работает для меня, но я хочу привыкнуть обрабатывать исключения очень чистым способом, так как некоторые мои прошлые проекты были покрыты "catch (Exception e)" .... и разбираем e.Message ... "

Вот мой пример кода:

public class CSVData
{
    DataTable data;
    public CSVData(string file)
    {
        try
        {
            this.data = CSVReader.ToDataTable(file); //throws a few basic exceptions
        }
        catch (FileNotFoundException e)
        {
            throw new FailedLoadingCSVException(e, currentLine, file);
        }
        catch (IOException e)
        {
            throw new FailedLoadingCSVException(e, currentLine, file);
        }
        catch (ArgumentNullException e)
        {
            throw new FailedLoadingCSVException(e, currentLine, file);
        }
        catch (ArgumentException e)
        {
            throw new FailedLoadingCSVException(e, currentLine, file);
        }
        catch (OutOfMemoryException e)
        {
            throw new FailedLoadingCSVException(e, currentLine, file);
        }
    }

    class FailedLoadingCSVException : Exception
    {
        public int failedAtLine;

        public FailedLoadingCSVException(Exception e, int failedLine, string file)
            :base ("The system failed at loading "+file+" at line "+failedLine, e)
        {
            this.failedAtLine = failedLine;
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 16 декабря 2011
try
{
}
catch ( Exception ex )
{
   if ( e is FileNotFoundException ||
        e is IOException ||
        // enumerate few 
       )
       throw new FailedLoadingCSVException(e, currentLine, file);
   else
       throw; // rethrow all other exceptions without touching them         
}
0 голосов
/ 16 декабря 2011
try
{
    this.data = CSVReader.ToDataTable(file); //throws a few basic exceptions
}
catch (Exception e)
{
   Console.WriteLine(e.Message);        
}
//unless you know what the exact Exception of the CSVReader is you can always just use Base Exception Class.. 
0 голосов
/ 16 декабря 2011

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

   try 
    { 
        this.data = CSVReader.ToDataTable(file); //throws a few basic exceptions 
    } 
    catch (Exception e) 
    { 
        throw new FailedLoadingCSVException(e, currentLine, file); 
    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...