Проблемы с try..except в Delphi 10.3 при разработке для MacOS Big Sur
Разработчики, использующие Delphi для создания приложений под MacOS, иногда сталкиваются с трудностями при работе с обработкой исключений. В частности, в Delphi 10.3 пользователи могут столкнуться с ситуацией, когда конструкция try..except не работает корректно, и вместо обработки исключения происходит бесконечный цикл из-за возникновения нового исключения "Access Violation".
Описание проблемы
Проблема заключается в том, что при возникновении исключения в коде, написанном на Object Pascal в среде Delphi 10.3 для 64-битной версии MacOS Big Sur, конструкция try..except не выполняется. Вместо этого, RTL (Runtime Library) генерирует ошибку при поднятии исключения, что приводит к новому исключению "Access Violation", входящему в бесконечный цикл.
Пример кода, вызывающего проблему
unit Unit8;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls;
type
TForm8 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
function Str2Float(str: String): Extended;
var
Form8: TForm8;
implementation
{$R *.fmx}
procedure TForm8.Button1Click(Sender: TObject);
var
f: Extended;
begin
f := Str2Float('10,7');
ShowMessage('Resultat : ' + FloatToStr(f));
end;
function Str2Float(str: String): Extended;
var
dec: Char;
begin
result := 0;
if Length(str) > 0 then begin
dec := FormatSettings.DecimalSeparator;
FormatSettings.DecimalSeparator := '.';
try
result := StrToFloat(str);
except
on E: Exception do begin
FormatSettings.DecimalSeparator := ',';
try
result := StrToFloat(str);
except
on E: Exception do
result := 0;
end;
end;
end;
FormatSettings.DecimalSeparator := dec;
end;
end;
end.
При вызове функции Str2Float с параметром '10,7' возникает исключение, так как используется запятая в качестве разделителя десятичных долей, в то время как StrToFloat ожидает точку. В коде предусмотрена попытка изменить разделитель десятичных долей на точку, но это не приводит к ожидаемому результату из-за ошибки в RTL.
Подтвержденный ответ
Чтобы решить проблему с обработкой исключений в Delphi 10.3 для MacOS, рекомендуется использовать функцию TryStrToFloat вместо StrToFloat. Это позволит избежать необходимости изменения глобальных настроек формата и упростит код. Также полезно использовать конструкцию try..finally для сохранения и восстановления настроек разделителя десятичных долей.
function Str2Float(str: String): Extended;
var
localFormatSettings: TFormatSettings;
begin
localFormatSettings := TFormatSettings.Create(FormatSettings);
try
localFormatSettings.DecimalSeparator := '.';
Result := TryStrToFloat(str, localFormatSettings);
finally
localFormatSettings.Free;
end;
end;
Альтернативный ответ
В случае, если предложенный выше метод не решает проблему, стоит обратить внимание на то, что в документации RAD Studio упоминается отсутствие поддержки структурированного обработчика исключений в MacOS, если исключение возникает вне RTL/Delphi классов. Это документировано в разделе "Differences between Windows and macOS". В таком случае, разработчикам следует искать альтернативные способы обеспечения выполнения кода очистки при возникновении исключений.
Заключение
При разработке приложений для MacOS с использованием Delphi 10.3 важно быть внимательным к особенностям обработки исключений. Использование TryStrToFloat и локальных настроек формата может помочь избежать распространенных проблем. В случае возникновения сложностей, рекомендуется тщательно изучить документацию и искать решения, учитывая специфику платформы MacOS.
Разработчики столкнулись с проблемами в обработке исключений в Delphi 10.3 при работе над приложениями для MacOS Big Sur.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS