2009-03-17 4 views
1

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

Код что-то вроде этого:

try 
{ 
    // Do stuff 
} 
catch (SomeException e) 
{ 
    throw new SomeExceptionWithContextInfo(); 
} 
catch (Exception e) 
{ 
    // Handle unexpected exception gracefully 
} 

Проблема у меня в том, что общее исключение догоняет мое новое исключение. есть ли способ избежать этого?

Мое текущее решение включает проверку типа исключения и повторение его, если это тип, который я только что создал.

+1

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

ответ

6

код Вы разместили должны работать, как показано в этом тесте приложение:

using System; 

class OtherException : Exception {} 

class Test 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      Foo(); 
     } 
     catch (OtherException) 
     { 
      Console.WriteLine("Caught OtherException"); 
     } 
    } 

    static void Foo() 
    { 
     try 
     { 
      string x = null; 
      int y = x.Length; 
     } 
     catch (NullReferenceException) 
     { 
      throw new OtherException(); 
     } 
     catch (Exception) 
     { 
      Console.WriteLine("Caught plain Exception"); 
     } 
    } 
} 

Это просто печатает «Caught OtherException» а не «Caught plain Exception». Вы уверены, что у вас нет вложенного блока try в вашем реальном коде? Не могли бы вы разместить короткий, но полный пример, который показывает вашу проблему?

Вам действительно нужно поймать Исключение в вашем методе? Это очень редко хорошая идея.

+0

Это правильно, но в методе Main нет try/catch, тогда будет обнаружено простое исключение, вот что происходит, я думаю. – Groo

+0

Если в методе Main нет try/catch, приложение будет прервано, потому что исключение не будет обрабатываться вообще. –

+0

У меня плохо получается, что это было другое исключение –

2

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

Предлагаю снова взглянуть на код, так как либо они не в этом порядке, либо код фактически не бросает этот тип исключения.

Вот ссылка на MSDN о примерке уловом: http://msdn.microsoft.com/en-us/library/0yd65esw(VS.80).aspx

0

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

try { // Outer try/catch 
    DoSomething(); 

    try { 
     /* */ 
    } catch(NotGeneralException e) { 
     /* */ 
    } catch(AnotherNotGeneralException e) { 
     throw new SomeOtherException("Exception message"); 
    } 
} catch(SomeOtherException e) { 
    /* */ 
} 

В качестве альтернативы только поймать общее исключение и повторно выдать SomeOtherExcepion

try { 

} catch(Exception e) { 
    throw new SomeOtherException("Exception message"); 
} 
+0

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

2

Вы делаете это правильно. Общее исключение не поймает конкретного.