2011-02-05 2 views
0

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

}

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

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.

ответ

0

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

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

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

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

1

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

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; 
} 
+0

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

+0

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

+0

И вы все равно можете выполнить «изменение», какие исключения обрабатывать по типу. Перечисление - это просто ненужная «жестокость». – Didaxis

3

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

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