определяемые пользователем исключения с перечислением «уровень ошибки» - PullRequest
0 голосов
/ 05 февраля 2011

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

Мой код выглядит следующим образом.

У меня есть класс MyException:

namespace ExceptionHandling
{
    public class MyException : ApplicationException
    {
        public MyException(string message)
            : base(message)
        { 

        }

        public MyException(string message, Exception innerException)
            : base(message, innerException)
        { 

        }
    }
}

Одним из моих исключений является IntParseException, этот класс выглядит так:

namespace ExceptionTester
{
    class IntParseException : MyException
    {
    string dataToParse;

    public IntParseException(string dataToParse)
        : base(" [ERROR] Could not parse " + dataToParse + " to int")
    {
        this.dataToParse = dataToParse;

    }

    public IntParseException(string dataToParse, Exception innerexception) 
        : base(" [ERROR] Could not parse " + dataToParse + " to int", innerexception)
    {
        this.dataToParse = dataToParse;           
    }
}

}

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

    private void btnSave_Click(object sender, EventArgs e)
    {
        try
        {
            try
            {
                int.Parse(txtNumber.Text);
            }
            catch (Exception ex)
            {  
                throw new IntParseException(txtNumber.Text, ex);
            }
        }
        catch (Exception ex)
        {
            LogWriter lw = new LogWriter(ex.Source, ex.TargetSite.ToString(), ex.Message);
            logwindow.upDateLogWindow();
            MessageBox.Show("Please enter a number");                          
        }
    }

Я регистрирую свои исключения, и этот класс выглядит так:

namespace ExceptionTester
{
    class LogWriter
    {
        public LogWriter(string exSource, string exTargetSite, string exMessage)
        {
            StreamWriter SW;
            SW = File.AppendText(@"logfile.txt");
            string timeStamp = "[" + DateTime.Now + "] ";
            string source = "An error occured in the application ";
            string targetSite = ", while executing the method: ";
            SW.WriteLine(timeStamp + source + exSource + targetSite +exTargetSite + exMessage);
            SW.Flush();
            SW.Close();
        }

    }
}

Итак, мой вопрос, как мне добавить тип enum к моим исключениям, который позволил бы мне выбрать, какие исключения я хочу регистрировать. Например, в какой-то момент я хотел бы регистрировать все исключения, но в другое время я хочу только регистрировать userInputErrors.

Ответы [ 3 ]

3 голосов
/ 05 февраля 2011

Кстати, Microsoft больше не рекомендует вам наследовать от ApplicationException. Получите непосредственно от Exception, вместо этого.

Кроме того, при ведении журнала обязательно регистрируйте все исключения. Используйте ex.ToString (), а не ex.Message и т. Д. Это гарантирует, что вы увидите все, что хочет видеть класс исключений, включая все внутренние исключения.

1 голос
/ 05 февраля 2011

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

try
{
    // do stuff that might throw exception
}
catch(ExceptionType1 ex1)
{
    // Ignore
}
catch(ExceptionType2 ex2)
{
    // Log
}

Тем не менее, было бы тривиально добавить enum к вашему пользовательскому исключению, хотя я НЕ СОГЛАШАЮСЯ С ЭТИМ ХОККЕМИ ЛОШАДИ!

enum ExceptionLevel
{
    One, Two, Three
}

class MyException : ApplicationException
{
    ExceptionLevel ExceptionLevel;
}
0 голосов
/ 05 февраля 2011

Я предлагаю создать новый базовый класс исключений, унаследованный от Application Exception, который включает перечисление: s

public enum ErrorLevel { UserInputError, DatabaseError, OtherError... };

public class BaseException : ApplicationException {
  protected ErrorLevel _errorLevel;
  ...
}

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

...