Как подавить исключения, исходящие из сборок [дубликат]

Ссылка NullReferenceException или Object, не установленная на экземпляр объекта, возникает, когда объект класса, который вы пытаетесь использовать, не создается. Например:

Предположим, что у вас есть класс с именем Student.

public class Student
{
    private string FirstName;
    private string LastName;
    public string GetFullName()
    {
        return FirstName + LastName;
    }
}

Теперь рассмотрим другой класс, в котором вы пытаетесь получить полное имя учащегося.

public class StudentInfo
{      
    public string GetStudentName()
    {
        Student s;
        string fullname = s.GetFullName();
        return fullname;
    }        
}

Как видно из вышеприведенного кода, оператор Student s - объявляет только переменную типа Student, обратите внимание, что класс Student не создается в этой точке. Следовательно, когда выполняется выполнение инструкции s.GetFullName (), она выкинет исключение NullReferenceException.

148
задан Jeremy 12 August 2010 в 16:33
поделиться

4 ответа

В .NET 4.0 среда выполнения обрабатывает определенные исключения, вызванные ошибками обработки структурированных ошибок Windows (SEH) в качестве индикаторов Corrupted State. Эти Исключенные Исключения Исключения (CSE) не могут быть уловлены вашим стандартным управляемым кодом. Я не буду вдаваться в то, почему и как здесь. Прочтите эту статью о CSE в .NET 4.0 Framework:

http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035

Но есть надежда. Есть несколько способов обойти это:

  1. Перекомпилировать как сборку .NET 3.5 и запустить ее в .NET 4.0.
  2. Добавить строку в конфигурационный файл вашего приложения в элементе конфигурации / времени выполнения: <legacyCorruptedStateExceptionsPolicy enabled="true|false"/>
  3. Украсить методы, которые вы хотите поймать в этих исключениях с помощью атрибута HandleProcessCorruptedStateExceptions. Подробнее см. В http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035 .

EDIT

Ранее я упомянул сообщение forum для получения дополнительной информации. Но так как Microsoft Connect был удален, вот дополнительные сведения, если вам интересно:

От Gaurav Khanna, разработчика из команды CLR Microsoft

Это поведение по дизайну из-за особенностей CLR 4.0, называемых «Corrupted State Exceptions». Проще говоря, управляемый код не должен пытаться поймать исключения, указывающие на поврежденное состояние процесса, и AV является одним из них.

Затем он продолжает ссылаться на документацию на HandleProcessCorruptedStateExceptionsAttribute и вышеприведенной статье. Достаточно сказать, что это определенно стоит прочитать, если вы планируете использовать эти типы исключений.

251
ответ дан villecoder 25 August 2018 в 08:50
поделиться
  • 1
    HandleProcessCorruptedStateExceptions делает трюк. – Jeremy 29 August 2011 в 16:37
  • 2
    HandleProcessCorruptedStateExceptions работает для меня в .Net 4.5. – deerchao 26 May 2013 в 09:56
  • 3
    Спасибо villecoder, вы жемчужина! Я несколько недель занимался этой проблемой, пытаясь решить коренную проблему и, наконец, смирился с симптомом. Ваше решение идеально. – gadildafissh 30 July 2013 в 19:45
  • 4
    ! Имейте в виду: настоятельно рекомендуется завершить этот процесс после AccessViolationException, который является нарушенным исключением государства (CSE). В противном случае это может привести к более критическим ошибкам. – Zbigniew Wiadro 8 December 2014 в 15:56
  • 5
    Спасибо, это действительно полезно, хотя сначала мне показалось, что мне нужно сделать все 3 шага , чтобы иметь возможность поймать эти исключения, в то время как на самом деле это «логический OR» & quot; способов сделать это. :) – Lou 10 October 2016 в 09:58

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

Шаг # 1 - Добавить следующий фрагмент в файл конфигурации

<configuration>
   <runtime>
      <legacyCorruptedStateExceptionsPolicy enabled="true" />
   </runtime>
</configuration>

Шаг # 2

Добавить -

[HandleProcessCorruptedStateExceptions]

[SecurityCritical]

в верхней части функции, которую вы связываете, поймать исключение

source: http://www.gisremotesensing.com /2017/03/catch-exception-attempted-to-read-or.html

4
ответ дан EvilInside 25 August 2018 в 08:50
поделиться
  • 1
    Согласно msdn.microsoft.com/en-us/library/… , атрибут SecurityCriticalAttribute эквивалентен запросу связи для полного доверия. Я не думаю, что описанная проблема требует требовать полного доверия. – Jeremy 23 March 2017 в 19:59

Добавьте в конфигурационный файл следующее: оно будет поймано в блоке try catch. Слово осторожности ... старайтесь избегать этой ситуации, так как это означает, что происходит какое-то нарушение.

<configuration>
   <runtime>
      <legacyCorruptedStateExceptionsPolicy enabled="true" />
   </runtime>
</configuration>
11
ответ дан Partha 25 August 2018 в 08:50
поделиться
  • 1
    Для тех, кто использует c ++ / cli как dll, код должен быть добавлен в верхний .exe-проект. – Felix 20 June 2017 в 02:34

Вы можете попробовать использовать AppDomain.UnhandledException и посмотреть, позволяет ли это его поймать.

** EDIT *

Вот несколько более подробная информация , которая может быть полезна (долго читается).

1
ответ дан Tony Abrams 25 August 2018 в 08:50
поделиться
  • 1
    Tried AppDomain.UnhandledException, не повезло, даст статью прочитанной ... – Jeremy 12 August 2010 в 21:05
  • 2
    Этот ответ больше не является точным из-за изменений в платформе .NET. До 4.0 это правильно. За раздел AccessViolationException и блоки try / catch в msdn.microsoft.com/en-us/library/… – Tedford 11 August 2017 в 17:52
Другие вопросы по тегам:

Похожие вопросы: