2010-07-06 6 views
0

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

У меня есть интерфейс ILog, который имеет два метода, открытых для части кода ошибки, составляющей код. FlagError и GetErrorCode; FlagError устанавливает бит в целое число, каждый бит представляет собой некоторую ошибку. GetErrorCode (который будет возвращаемым значением для метода Main) возвращает указанное целое число.

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

Но проблема в том, как именно я хотел бы передать пользователям, что код ошибки «XYZ» означает, что приложение попало в эти ненормальные состояния во время выполнения дружественным образом?

Илог Интерфейс: (методы записи имеют перегрузки)

interface ILog 
{ 
    void FlagError (int errorCode); 
    int GetErrorCode(); 

    #region Other ILog Methods 

    void WriteError(string message); 
    void WriteWarning(string message); 
    void WriteInfo(string message); 
    void WriteDebug(string message); 

    #endregion 
} 

Вход Класс:

abstract class Log : ILog 
{ 
    public void 
    FlagError (int errorCode) 
    { 
     if (errorCode == 0 || errorCode == int.MinValue || errorCode != (errorCode & -errorCode)) 
     { 
      throw new IndexOutOfRangeException(); 
     } 

     if ((m_errorCode & errorCode) == errorCode) 
      return; 

     m_errorCode += errorCode; 
    } 

    public int 
    GetErrorCode() 
    { 
     return m_errorCode; 
    } 


    #region Other ILog Methods  

} 

Я предположил, используя атрибут каждого значения перечислений с описанием этой ошибки, а затем просто имея небольшой процесс или что-то, что поможет «разобрать» код ошибки в понятное для человека описание.

Но Idk, любые идеи?

+0

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

+0

Это то, что вы пытаетесь сделать? http://stackoverflow.com/questions/164425/determining-if-enum-value-is-in-list-c – Rake36

+0

Проблема с возвратом нескольких исключений заключается в том, что некоторые ошибки могут быть помечены без исключения, которое действительно выбрасывается, и я на самом деле не хотите идти «log.FlagError (новое AnonException (« This Happened »)); Но это хорошая идея. И нет, я не пытаюсь сделать то, что находится в ссылке. Кроме того, если вы хотите, я бы с удовольствием посмотрел бы на мой ответ. – Meiscooldude

ответ

2

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

В результате я создал атрибут описания, который я добавил к каждому значению перечисления, а затем создал метод расширения GetDescription в Enum. Затем, когда я отмечаю ошибку, ее описание записывается в консоль/файл/окно или w/e.

Я полагаю, что я должен был выявить некоторые из методов ILog для этого решения, которое было найдено.

Новый FlagError Метод:

public void 
FlagError (Enum errorCode) 
{ 
    int errorValue = Convert.ToInt32 (errorCode); 

    if (errorValue == 0 || errorValue == int.MinValue 
     || errorValue != (errorValue & -errorValue)) 
    { 
     WriteError ("ErrorCode {0}: {1}", 
        errorValue, 
        errorCode.GetDescription()); 

     m_errorCode = int.MinValue; 

     throw new IndexOutOfRangeException(); 
    } 

    if ((m_errorCode & errorValue) == errorValue) 
     return; 

    WriteError ("ErrorCode {0}: {1}", 
       errorValue, 
       errorCode.GetDescription()); 

    m_errorCode += errorValue; 
} 

GetDescription Удлинитель Метод:

public static string 
GetDescription (this Enum @enum) 
{ 
    StringBuilder builder; 

    var descriptionAttributes = @enum.GetType() 
            .GetCustomAttributes (
              typeof (DescriptionAttribute), 
              false) as DescriptionAttribute []; 

    if (descriptionAttributes == null || descriptionAttributes.Length == 0) 
     return string.Empty; 

    builder = new StringBuilder(); 

    foreach (DescriptionAttribute description in descriptionAttributes) 
    { 
     builder.Append (description.Description); 
     builder.AppendLine(); 
    } 

    return builder.ToString(); 
} 

Описание Атрибут:

public sealed class DescriptionAttribute : Attribute 
{ 
    public 
    DescriptionAttribute (string description) 
    { 
     m_description = description; 
    } 

    public string 
    Description 
    { 
     get 
     { 
      return m_description; 
     } 
    } 


    private readonly string m_description; 
} 

Если у кого есть какие-либо дополнительные материалы, я хотел бы услышать его.

+0

Если вы обнаружите, что используете это широко, потенциальная оптимизация производительности должна заключаться в том, чтобы сделать класс 'DescriptionAttribute' запечатанным, использовать явную строковую переменную строки, которая является' readonly', и иметь свойство 'Description' имеет только getter, который обращается к этому явная переменная. –

0

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

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

+0

Мне нравится идея иметь человекообразные описания в файле конфигурации или что-то в этом роде, но это сложно поддерживать, потому что я не могу гарантировать, что если разработчик добавит новый код ошибки, он вернется и изменит конфигурационный файл. Я ищу способ, который очевиден для разработчиков и легко интерпретируется для пользователя. – Meiscooldude

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