определяемые пользователем исключения с уровнем ошибки перечисления

Я сделал несколько пользовательских исключений и хотел бы добавить уровень ошибки для каждого исключения. например, 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();
        }

    }
}

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


person Community    schedule 05.02.2011    source источник


Ответы (3)


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

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

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

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

person Ray    schedule 05.02.2011

Кстати, Майкрософт больше не рекомендует делать производные от ApplicationException. Вместо этого получайте непосредственно от Exception.

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

person Community    schedule 05.02.2011

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

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

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

enum ExceptionLevel
{
    One, Two, Three
}

class MyException : ApplicationException
{
    ExceptionLevel ExceptionLevel;
}
person Didaxis    schedule 05.02.2011
comment
Я не могу изменить его во время работы моей программы. поэтому мне не нужно что-то менять в коде. Просто подумал, что enum можно использовать для чего-то подобного, но я просто не уверен, как это сделать. - person ; 05.02.2011
comment
Я бы сказал в качестве общего руководства, что то, что вы предлагаете, является плохим дизайнерским решением. Я имею в виду, что обработка исключений по своей природе происходит в режиме реального времени. Я просто не вижу никакой пользы от этой парадигмы обработки исключений. - person Didaxis; 05.02.2011
comment
И вы все еще можете изменить, какие исключения обрабатывать в зависимости от типа. Перечисление - это просто ненужная грубость. - person Didaxis; 05.02.2011
comment
#Eric - я прочитал его вопрос, чтобы сказать, что он хотел контролировать свое исключение логирование, а не изменять его обработку исключения. Мне идея перечисления кажется хорошим способом справиться с этим. - person Ray; 05.02.2011