2013-08-14 4 views
2

Я создал пользовательский класс исключений, как показано нижеЛовля пользовательских исключений в C#

namespace testingEXception 
{ 
    public class CustomException : Exception 
    {    
     public CustomException() 
     { 
     } 
     public CustomException(string message) 
      : base(message) 
     { 
     } 

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

     } 
    } 
} 

Я метание исключения из другого проекта в том же растворе, как этого

namespace ConsoleApplication1 
{ 
    public class testClass 
    { 
     public void compare() 
     { 
      if (1 > 0) 
      { 
       throw new CustomException("Invalid Code"); 
      } 
     } 
    } 
} 

и ловил его, как это

namespace testingEXception 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       testClass obj = new testClass(); 
       obj.compare(); 

      } 
      catch (testingEXception.CustomException ex) 
      { 
       //throw; 
      } 
      catch (Exception ex) 
      { 
       // throw new CustomException(ex.Message); 
      } 

      Console.ReadKey(); 
     } 
    } 
} 

Проблема заключается в том, что исключение не попадает в первый улов, а вместо gett который пойман вторым уловом, несмотря на то, что тип исключения показывает CustomException.

+0

То, что вы показываете, является правильным и должно работать. Так или вы не делаете то, что думаете, что делаете, или что происходит не так, как вы думаете. Убедитесь, что у вас нет нескольких CustomException в разных пространствах имен (в VS do 'Go to definition' в броске и в catch-версии CustomeException) – pm100

+3

С помощью «throw» в catch (CustomException) он будет повторно заброшен и пойман путем улова (исключение). Это то, что вы видите? –

+0

@PeterRitchie при отладке, отладчик не останавливается на первом catch, вместо этого останавливается на втором улове. –

ответ

1

Вы должны предоставить более подробную информацию, следующий код выводит "CustomException":

try 
{ 
    throw new CustomException("Invalid code."); 
} 
catch (CustomException ex) 
{ 
    System.Diagnostics.Trace.WriteLine("CustomException"); 
    throw; 
} 
catch (Exception ex) 
{ 
    throw; 
} 

С следующего класса:

public class CustomException : Exception 
{ 
    public CustomException() 
    { 
    } 
    public CustomException(string message) 
     : base(message) 
    { 
    } 

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

    } 
} 

Update:

Что касается оптимизации и оптимизации out throw: этого не может быть, потому что какой-либо конкретный блок кода не может знать, может ли вызывающий выше в стеке иметь код, чтобы tch CustomException. Выбрасывание исключения - это видимый побочный эффект, и в CLI есть различные гарантии, чтобы гарантировать, что видимые побочные эффекты остаются видимыми.

Кроме того, попробуйте, поймайте и, наконец, блоки «защищенные регионы» в CLI-talk. Эти регионы являются особенными в том, что операции в регионе с «видимыми» побочными эффектами не могут изменить их видимые побочные эффекты. Для получения более подробной информации см. http://lynk.at/qH8SHk и http://lynk.at/pJcg98

+0

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

+0

Компилятор делает почти оптимизацию в блоках try или finally. Конечно, он не может оптимизировать бросок или улов. –

+0

Я не думаю, что это так. Я подозреваю, что происходит что-то еще, и требуется более подробная информация. Может быть, как кто-то еще упомянул, есть конфликт типа или что-то в этом роде. Я только указываю, что результат двух блоков catch, когда он их писал, одинаковый, если все, что либо делает это, - это повторное исключение, поэтому, если компилятор достаточно умный, возможно, он сможет оптимизировать первый улов. Поведение не изменится. Не сказать, что он делает или будет. – brader24