Исключения файлов DRY принцип C # - PullRequest
0 голосов
/ 28 сентября 2018

При выполнении множества различных файловых процессов в C # всегда используйте блок try catch, как показано ниже.Есть ли способ заключить это в общий класс, поэтому мне не нужно повторять СУХОЙ.

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

// The caller does not have the required permission.
Catch(UnauthorizedAccessException uae)
{

}

// sourceFileName or destFileName is a zero-length string, contains only white space, or contains one or more invalid characters as defined by InvalidPathChars.
// -or- sourceFileName or destFileName specifies a directory.
Catch(ArgumentException ae)
{

}

// sourceFileName or destFileName is null.
Catch(ArgumentNullException ane)
{

}

// The specified path, file name, or both exceed the system-defined maximum length.
Catch(PathTooLongException ptle)
{

}

// The path specified in sourceFileName or destFileName is invalid (for example, it is on an unmapped drive).
Catch(DirectoryNotFoundException dnfe)
{

}

// sourceFileName was not found.
Catch(FileNotFoundException fnfe
{

}

// destFileName exists. -or- An I/O error has occurred.
Catch(IOException ioe)
{

}

// sourceFileName or destFileName is in an invalid format.
Catch(NotSupportedException nse)
{

}

1 Ответ

0 голосов
/ 28 сентября 2018

У вас есть много вариантов здесь.Просто упомянуть 2 из них:

Опция 1: оболочка и действие.

public void ProcessFile()
{
    ExceptionFilters.CatchFileExceptions( () => {
        // .. do your thing
    });
}

// somewhere else
public static class ExceptionFilters
{
    public static void CatchFileExceptions(Action action)
    {
        try
        {
            action();
        }
        catch(ExceptionTypeA aex)
        {
        }
        // ... and so on
        catch(Exception ex)
        {
        }
    }
}

Опция 2: использовать фильтры исключений Эта опция фактически перехватывает каждое исключение, если только вы не используете фильтры (C #6 +)

public void ProcessFile()
{
    try
    {
        // do your thing
    }
    catch(Exception ex)
    {
        if(!ProcessFileExceptions(ex))
        {
            throw; // if above hasn't handled exception rethrow
        }
    }
}

public static void ProcessFileExceptions(Exception ex)
{
    if(ex is ArgumentNullException)
    {
        throw new MyException("message", ex); // convert exception if needed
    }

    // and so on

    return true;
}

здесь вы также можете отфильтровать интересующие вас исключения:

public void ProcessFile()
{
    try
    {
        // do your thing
    }
    catch(Exception ex) when(IsFileException(ex))
    {
        if(!ProcessFileExceptions(ex))
        {
            throw; // if above hasn't converted exception rethrow
        }
    }
}

public static bool IsFileException(Exception ex)
{
    return ex is ArgumentNullException || ex is FileNotFoundException; // .. etc
}
...