2015-06-02 2 views
1

У меня есть приложение (выпущено) и исключение NullReferenceException, которое появляется для пользователей ОЧЕНЬ редко, но я хочу позаботиться об этом. Я просмотрел стек и методы в нем и не могу найти никакого конкретного места, где это произойдет (это довольно большой метод/алгоритм). На данный момент я просто буду окружать вызов с помощью try/catch, но хотел бы обработать его лучше, если бы я мог разобраться в этом случае.
Проблема, насколько я могу судить, NRE не дает никакого представления о том, что именно в коде вызвало это. Есть ли способ получить номера строк или любую другую информацию, которая могла бы намекнуть на причину?NullReferenceException информация о местоположении?

+2

Смотрите это: http://stackoverflow.com/questions/628565/display-lines-number-in-stack-trace-for-net-assembly-in-release-mode –

+0

Вы могли бы попробуйте выполнить единичное тестирование и пропустите все возможные (и невозможные) значения аргументов ... –

ответ

2

Несколько советов:

  1. При развертывании файла символы (.pdb) вместе с вашим исполняемым/DLL файлов, а затем трассировки стека вы получите, будет содержать номера строк.
  2. Он также может помочь разбить ваш метод на более мелкие части, чтобы ваша трассировка стека давала вам лучшее представление о том, где вы были, когда произошла ошибка.
  3. Вы можете начать каждый метод, проверив его входы для нулевых или других недопустимых значений, так что вы сбой быстро со значимым сообщением.

    private void DoSomething(int thingId, string value) 
    { 
        if(thingId <= 0) throw new ArgumentOutOfRangeException("thingId", thingId); 
        if(value == null) throw new ArgumentNullException("value"); 
        ... 
    } 
    
  4. Вы можете окружить каждый метод с оберткой исключения предоставить больше информации на каждом уровне трассировки стека на его пути.

    private void DoSomething(int thingId, string value) 
    { 
        try 
        { 
         ... 
        } 
        catch (Exception e) 
        { 
         throw new Exception("Failed to Do Something with arguments " + 
          new {thingId, value}, 
          e); // remember to include the original exception as an inner exception 
        } 
    } 
    
Смежные вопросы