2011-02-04 5 views
1

Есть ли способ поймать эти Исключения? (Я не ищу «просто положил try/catch или на ошибку goto вокруг них»). Я пытаюсь выяснить, могут ли эти ошибки быть пойманы чем-то вне их.Есть ли способ поймать эти Исключения?

Public Class ABC 
    Shared Sub New() 
    throw new Exception("Ha!") 
    End Sub 
End Class 

или это:

Public Class ABC 
    Dim obj as Object = CreateObject() 

    Public Function CreateObject() 
    throw new Exception("Ha!") 
    End Function 
End Class 

КСТАТИ Собираем их в мой класс стартапа (это форма Windows), как первые строки в "Shared Sub New()" не работает:

AddHandler Application.ThreadException, AddressOf Application_ThreadException 
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException 
+2

Грубо упоминать «On Error Goto» публично;) Не делайте этого снова. –

+0

Их можно поймать на любом уровне в стеке вызовов. Может быть, я не понимаю, о чем вы спрашиваете. – Fantius

+0

@Fantius: первый бросается в статический конструктор, что делает его немного сложнее, чем это. Но второй можно поймать в любом месте, где вы делаете 'новый ABC()', так как он забрасывается в конструкторе. –

ответ

3

Смотреть это:
http://temujin.blogsome.com/2006/03/15/static-constructors-and-exceptions/

Ключевые моменты:

если исключение occurrs среда выполнения будет ВСЕГДА обернуть его в TypeInitializationException

Так попытайтесь искать TypeInitializationException на уровне/AppDomain приложения. Также:

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

Вкратце - не делайте ничего, что могло бы исключать исключения из статических (общих) конструкторов. Переместите код в статические свойства или методы или конструктор экземпляра.

+0

Это интересная идея, но нет никакого события, чтобы зафиксировать это. Можете ли вы привести пример исключения TypeInitializationException, на которое я могу подписаться. Как вы можете себе представить, я не могу поставить try/catch во втором случае. Не знаю, где я должен идти от этого ... – Denis

Смежные вопросы