Отключить обработку исключений и позволить windows поймать его?

Я хочу отключить ловлю исключений Delphi и позволить Windows поймать его - что делает его производить окно, как " AppName разбился. Debug, Send", добавьте это в события приложения, создайте дамп памяти и так далее.

по умолчанию Delphi ловит все исключения в TApplication.Запустить процедуру... Как я могу избежать этого, не изменяя формы.ССА?

4 ответов


вы можете установить JITEnable на " 1 " или выше (по умолчанию '0'). С "1", не собственные исключения, С выше, чем "1", все исключения будут обрабатываться JIT или WER (в зависимости от системы).

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

procedure TForm1.Button1Click(Sender: TObject);
begin
  raise EAccessViolation.Create('access denied');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  try
    PInteger(0)^ := 0;
  except
  end;
end;

initialization
  JITEnable := 1;

первый пример-собственное исключение, он будет обрабатываться механизмом обработки исключений приложений, когда JITEnable это 1. Но второй пример вызовет JIT / WER.


вы можете добавить OnException обработчик, который повторно вызвал исключение:

class procedure TMainForm.OnException(Sender: TObject; E: Exception);
begin
  raise Exception(AcquireExceptionObject);
end;

initialization
  Application.OnException := TMainForm.OnException;

Я не уверен, почему вы вообще хотите это сделать. Более нормально использовать инструмент, такой как madExcept или EurekaLog, чтобы показать диалоговое окно ошибки, которое дает гораздо больше полезной информации, чем диалоговое окно системы.


Добавить свой собственный обработчик. Application.OnException вероятно, это то, что вы хотите. Лучше, чем оставлять его до windows, а также, как вы получаете различные поведения в зависимости от окружающей среды. Например, если отчет об ошибках windows включен, он спросит пользователя, хотят ли они Отправить отчет об ошибке MS.

Как г-н Хеффернан я рекомендую вам посмотреть на что-то вроде EurekaLog.


AS. Я согласен с голосами выше, что это желание довольно странное. Я также согласен с тем, что практически зацепление в TApplication.OnException, вероятно, будет достаточно ("если он выглядит как утка...")

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

обработчики исключений-это плагин для низкоуровневого RTL, как и управление кучей и т. д.

вы можете посмотреть на Kol (Key Objects Library). В Delphi 5 раз мне удалось сделать 2kb-размер файл DLL.

Что требуется отсутствие многих usualyl, принимаемых "на веру" особенности. Исключения были среди них.

чтобы включить исключения в замене RTL системы KOL, вам нужно было сделать некоторые $DEFINE, а затем код для добавления поддержки исключений в IDE был разблокирован.

Я считаю, что вы все еще можете получить эту модульную версию RTL и grep для этого $IfDef и посмотреть, какой код заменен на который. Я считаю, что есть справедливый шанс, что вы можете отменить это и сделать Windows избежать вызов Delphi RTL через исключения. Я не помню деталей, но я считаю, что обработчик исключений Delphi RTL просто зарегистрирован в Windows core в качестве обратного вызова. И вы, вероятно, можете отменить регистрацию (зарегистрировать обратный вызов nil). Я считаю, что вы можете найти его на складе RTL, но модульный RTL KOL просто облегчит поиск.