#delphi #error-handling #delphi-7
#delphi #обработка ошибок #delphi-7
Вопрос:
Как избежать ошибки при отображении маленького окна ошибки Windows?
Try
и Except
не работает, потому что ошибка отображается не Delphi, а из программы или, я думаю, из Windows.
try
Size:=TFileStream.Create(BitFile,fmOpenRead);
except on E: EFCreateError
do EC.Add('Error: ' IntToStr(GetLastError));
end;
Комментарии:
1. Лучшая версия этого вопроса указывала бы, что вы проделали некоторую работу, чтобы выяснить, откуда пришло сообщение об ошибке, и определили, что именно означает «внешнее событие».
2. Верно. Вы никак не можете сказать, что здесь происходит, это не ошибка, не код и даже не уверен, откуда приходит сообщение.
3. @Robrok: Я рад видеть, что вы, в конце концов, не отказались от разработки. Однако в этом случае вы вряд ли получите какие-либо хорошие ответы, если не объясните, что такое «маленькое окно ошибки Windows». Возможно, вы могли бы предоставить нам скриншот диалогового окна, чтобы мы, по крайней мере, знали, о каком окне ошибки вы говорите…
4. Я пытался использовать исполняемый файл вне отладчика. И все равно я получаю ошибку ******, но @GolezTrol нашел ответ на это. Я добавил TApplicationEvents в свою форму, а OnEeception добавил Memo1. Строки. Add(‘Ошибка: ‘ IntToStr(GetLastError);
5. Я удалил свой голос «против», когда ты улучшил свой вопрос, РобРок, не отказывайся от SO. Вы просто должны дать людям то, на что они могут ответить.
Ответ №1:
Отображается ли ошибка в вашем приложении? Иными словами, это необработанное исключение? Или это окно, отображаемое Windows или внешним приложением?
Вы говорите «событие», но обработчики событий также могут содержать блоки try ..except.
Если это исключение, и вы не знаете, откуда оно берется, вы можете использовать класс TApplicationEvents для подключения приложения.Событие onException. Он будет срабатывать при всех необработанных исключениях. Там вы можете ее перехватить, или, скорее, установить точку останова и использовать трассировку стека, чтобы увидеть, откуда исходит исключение.
Комментарии:
1. теперь ты мой любимый пользователь, твой ответ работает. Я люблю вас, мужчины. 🙂
Ответ №2:
Окно с ошибкой не означает, что возникло исключение. Окно с ошибкой может быть явно показано в коде.
Итак, похоже, ваш вопрос заключается в том, «Как я могу запретить стороннему коду работать так, как задумано?». Кроме декомпиляции двоичных файлов, боюсь, я мало что могу предложить, особенно если у вас нет исходного кода.
Если у вас есть исходный код и вы знаете процедуру, которую необходимо заменить, вы могли бы написать свою собственную замену и «перехватить» процедуру во время выполнения. Этот метод используется, например, проектом fastcode для замены процедуры delphi без перекомпиляции VCL. Вы можете увидеть реализацию в их проекте.
http://fastcode.sourceforge.net/
Модуль: FastcodePatch.pas
Ответ №3:
Вот оно
private
{ Private declarations }
public
procedure MyExceptionHandler(Sender : TObject; E : Exception ); //define exception handler
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.MyExceptionHandler(Sender:TObject;E:Exception);
begin
//Do nothing
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := MyExceptionHandler;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//Generate an exception
asm
mov eax,8272
mov [eax],$2FFFFF
end
end;
Комментарии:
1. по какой-либо причине вы отклоняете мой ответ?? потому что я не вижу ни одной
2. @opc0de: Нет объяснения того, что делает код (или не делает) или как он отвечает на вопрос … большой объем кода не помогает. (Я знаю, что я бы никогда не стал просто вставлять какой-то код, не понимая его.) Помимо этого … встроенный asm? Готов поспорить, что в Delphi есть гораздо лучшие способы генерировать исключение … например, о, я не знаю,
raise
один. Я не понизил голос, потому что я недостаточно знаю Delphi, чтобы судить об этом коде … но если бы я это сделал, вероятно, это были бы причины.3. 2 очевидные причины для понижения — волшебный указатель 8272 и волшебное DWORD 2FFFFFh
4. @opc0de, я сомневаюсь, что вы можете объяснить магические числа, стоящие за вашим «методом» для запуска исключения. Кроме того, помимо того, что вы не впадаете в истерику при критике, вам не следует публиковать фрагменты кода, которые вызывают внезапные недоумения у читателей.
5. если бы вы просто изменили asm на оператор raise и добавили пояснительный абзац, вы бы получили много положительных отзывов