Исключение вызвано AppDomain, когда это не должно? - PullRequest
3 голосов
/ 10 ноября 2009

Я работаю над MCTS и в настоящее время изучаю функциональность AppDomain. Но я сталкиваюсь с чем-то неясным. AppDomain должен захватывать Exception и позволять домену безопасно выгружаться. (С возможным исключением StackOverflowException, как предложено в другом месте)

AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
domain.UnhandledException += new UnhandledExceptionEventHandler(domain_UnhandledException);
AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, setup);

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

var type = (IDoSomeWork) domain.CreateInstanceAndUnwrap("Library1", "Library1.Class1");
type.Run();

Это создает исключение на type.Run() (так как я сделал это таким образом). Но разве AppDomain не должен захватить это безопасно? Разве не поэтому у нас есть AppDomain?

UPDATE:

В соответствии с просьбой, я включил определение Library1.Class1. Также, для ясности, UnhandledExceptionEventHandler не влияет на захват исключения и не имеет отношения к вопросу.

[Serializable]
public class Class1 : MarshalByRefObject, IDoSomeWork
{
    public void Run()
    {
        Debug.WriteLine(AppDomain.CurrentDomain.FriendlyName);
        throw new ApplicationException(String.Format("{0}", this.ToString()));
    }
}

Я подтвердил, что он работает в MyDomain.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2009

Событие UnhandledException не захватывает исключения в традиционном смысле, как блок try-catch (насколько мне известно), это просто информационная точка, позволяющая вам ведение журнала и такие задачи.

Цитируется из MSDN документации :

Это событие предоставляет уведомление о неучтенные исключения. Это позволяет приложение для регистрации информации о исключение перед системой обработчик по умолчанию сообщает об исключении пользователю и прекращает применение.

Таким образом, исключение по-прежнему будет отображаться в системном обработчике исключений по умолчанию.

0 голосов
/ 10 ноября 2009
 AddHandler Application.ThreadException, AddressOf MyExceptionHandler.HandleException

Добавляет обработчик исключений верхнего уровня, но в этом случае он может не выполнять то, что вы хотите.

...