2009-06-12 1 views
6

Раньше было, что если исключение получило и распространилось достаточно далеко от стека вызовов, основной цикл приложения обработал бы его и предоставил вам диалоговое окно. Похоже, что это поведение нарушено под Windows Vista. Если какое-либо исключение достигнет такого уровня, Vista запустится и говорит, что программа «перестала работать», когда она была в состоянии полностью работать под XP. (В этом вся причина, почему обработчик исключений в главном цикле существует, ради всего святого!)Как заставить Vista угасать мою программу на исключения?

Есть ли способ исправить это? Предпочтительно, в моем коде, а не только на моем компьютере, поэтому он не будет испортить другие системы?

+0

mmmm ... используя try..catch блоки и регистрировать ваши ошибки с помощью NLog или Log4Net в текстовом файле ??? – Perpetualcoder

+0

Замена события Application.OnException собственными не так уж сложно, плюс вы можете также регистрировать исключение в файле в этот момент. –

+0

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

ответ

11

Проверьте, чтобы глобальная переменная в System, JITEnable по-прежнему установлена ​​в 0. Если эта переменная установлена ​​в 1, аппаратные (и внешние) исключения вызовут это поведение, вызвав UnhandledExceptionFilter. Если оно установлено в 2, любое исключение вызовет его.

+0

Спасибо! Это сработало. –

+1

@Mason: Как JITEnable был установлен в первую очередь? Я думал, что он по умолчанию 0. –

1

Вы должны добавить обработчик исключений на уровне приложений, http://www.chami.com/tips/delphi/011497D.html. Также вы должны заглянуть в бег, сделанный, чтобы определить, почему эти исключения происходят, поэтому они могут быть исправлены.

+1

+1 для MadExcept. Удивительный продукт, абсолютно потрясающий. –

0

К сожалению, не все исключения были хорошо пойманы даже в XP. Когда-либо приложение просто исчезало, просто зависало и нуждалось в pskill? (какая-то версия Delphi?)
Я бы попытался подключить EurekaLog к вашему приложению и посмотреть, дает ли он некоторую информацию о том, что происходит.