Исключение кастинг - PullRequest
1 голос
/ 01 мая 2011

Я вставляю другое сообщение в зависимости от типа исключения.

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

Есть предложения, как мне это сделать?

private void ExceptionEngine(Exception e)
{
    if (e.)
    {
        exceptionTable.Rows.Add(null, e.GetType().ToString(), e.Message);
    }

Ответы [ 4 ]

4 голосов
/ 01 мая 2011
if (e is NullReferenceException)
{
    ...
}
else if (e is ArgumentNullException)
{
    ...
}
else if (e is SomeCustomException)
{
    ...
}
else
{
   ...
}

и внутри этих if предложений вы можете привести e к соответствующему типу исключения, чтобы получить некоторые конкретные свойства этого исключения: ((SomeCustomException)e).SomeCustomProperty

3 голосов
/ 01 мая 2011

Если весь код будет в блоках if / else, тогда лучше использовать множественный перехват (не забудьте сначала указать наиболее конкретные типы):

try {
  ...
} catch (ArgumentNullException e) {
  ...
} catch (ArgumentException e) { // More specific, this is base type for ArgumentNullException
  ...
} catch (MyBusinessProcessException e) {
  ...
} catch (Exception e) { // This needs to be last
  ...
}
2 голосов
/ 01 мая 2011

Я не могу использовать операторы switch с объектом исключения.

Если вы хотите использовать переключатель, вы всегда можете использовать Typename:

switch (e.GetType().Name)
{
   case "ArgumentException" : ... ;
}

Это имеет то преимущество, что вы не сопоставляете подтипы.

0 голосов
/ 01 мая 2011

Вы можете объединить обработку различных типов исключений (известных во время компиляции) с помощью предварительно определенного словаря. Например:

//  Maps to just String, but you could create and return whatever types you require...
public static class ExceptionProcessor {
    static Dictionary<System.Type, Func<String, Exception> sExDictionary = 
     new Dictionary<System.Type, Func<String, Exception> {
        { 
            typeof(System.Exception), _ => {
                return _.GetType().ToString();
            }
        },
        { 
            typeof(CustomException), _ => { 
                CustomException tTmp = (CustomException)_; 
                return tTmp.GetType().ToString() + tTmp.CustomMessage; 
            }
        }
    }

    public System.String GetInfo(System.Exception pEx) {
        return sExDictionary[pEx.GetType()](pEx);
    }
}

Использование:

private void ExceptionEngine(Exception e) {
    exceptionTable.AddRow(ExceptionProcessor.GetInfo(e));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...