Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Возвращаем обработку исключений в Delphi Berlin 10.1: как исправить пропущенные ошибки деления

Delphi , Синтаксис , Ошибки и Исключения

В последних версиях среды разработки Delphi, в частности в версии Berlin 10.1, произошли изменения в обработке исключений, в том числе и при делении на ноль. Разработчики столкнулись с ситуацией, когда вместо ожидаемого исключения при делении на ноль, программа продолжала выполняться, возвращая бесконечность (INF). Это поведение может быть неожиданным и привести к ошибкам в приложениях, особенно в тех, где необходимо строгое соблюдение логики обработки исключений.

Понимание проблемы

В коде на Object Pascal (Delphi) выражение 5/0 представляет собой константное выражение, которое компилятор может оценить без выполнения программы. Согласно правилам компиляции, положительное деление на ноль приводит к специальному значению +INF, определенному стандартом IEEE754.

Возвращение обработки исключений

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

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b: Double;
begin
  a := 5;
  b := 0;
  a := a / b; // Вызовет исключение деления на ноль
  ShowMessage(a.ToString);
end;

Альтернативный способ: использование функции SetExceptionMask

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

uses
  System.SysUtils,
  System.Math;

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b: Double;
begin
  SetExceptionMask([]);
  a := 5;
  b := 0;
  Halt(StrFloatDef(a / b, 'Error')); // Установит обработку исключения
end;

Для отключения всех исключений используйте SetExceptionMask(exAllArithmeticExceptions), а для включения всех - SetExceptionMask([]).

Заключение

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

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

Создано по материалам из источника по ссылке.

В последних версиях Delphi Berlin 10.1 произошли изменения в обработке исключений, в том числе при делении на ноль, что может привести к пропуску ожидаемых исключений и необходимости их исправления через изменение константных выражений или использование


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ошибки и Исключения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 12:48:17/0.0034909248352051/0