2017-02-17 17 views
1

Следующий код создает NullReferenceException, но не зацепила блоком Ьгу (в обоих Debug и Release режиме):Почему исключение не поймали?

using System; 

namespace ExceptionTest { 
    public class Program { 
     public static void Main(string[] args) { 
      String text = null; 
      try { 
       if (text.Equals("t1")) { 
        Console.WriteLine("r1"); 
       } else { 
        Console.WriteLine("r2"); 
       } 
      } catch(Exception ex) { 
       Console.WriteLine("Exception catched!"); 
      } 
     } 
    } 
} 

Вместо того, чтобы программы перерывов и ошибочную строку подсвечивается:

enter image description here

Почему?

Update: текстовое представление, за исключением, как было предложено Scott:

System.NullReferenceException occurred 
    HResult=-2147467261 
    Message=Object reference not set to an instance of an object. 
    Source=ExceptionTest 
+9

* Вы, вероятно, * есть ваш отладчик настроен разбить на первый авось исключения. Если вы запустили это без приложенного отладчика, напечатает ли оно «Исключенное исключение»? – vcsjones

+0

также вы пробовали использовать '==', если я не ошибаюсь, он генерирует исключения иначе, чем 'string.Equals (string)' – Andrew

+3

Как правило, это плохая практика, чтобы ловить общие исключения. Это может привести к пространственному и бесстрастному поведению в вашем коде. Не говоря уже о том, что исключения крайне неэффективны. Если переменная может быть нулевой, перед ее доступом вы должны проверить нулевое значение! –

ответ

3

На примере образа при настройках исключений: поворот флажком.

Выполняя это, он не будет ломаться, когда выбрано исключение нулевой ссылки. И catch поймает Исключение.

+1

Я выбрал этот ответ как правильный, потому что он первым определил решение. Спасибо! – salocinx

2

Если вы используете Visual Studio 2015:

Debug-> Windows-> Настройки исключений

Поиск NullReferenceException, и снимите это.

3

Это происходит потому, что у вас есть этот флажок установлен

enter image description here

Это делает ваш отладчик перерыв, прежде чем он попадает в блок поймать, если вы попали по-прежнему вы увидите, что по-прежнему, чтобы улов. Если вы снимите флажок, вы можете повторно включить его в окне «Настройки исключения», которое находится в раскрывающемся меню Debug -> Windows -> Exception Settings. Раздел «Исключения общего времени выполнения языка» содержит параметр NullRefrenceException.

enter image description here

+0

Спасибо за подробный ответ! – salocinx