Как избежать отображения ошибки?

#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 и добавили пояснительный абзац, вы бы получили много положительных отзывов