Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Не работает try except на Андроиде 7.0  [new]
Sergey_rb
Member

Откуда:
Сообщений: 956
Delphi 8 (RAD)

Не работает try except на Андроиде 7.0
При возникновении ошибки приложение вылетает без сообщения.

Есть какие-то варианты ловить ошибку на Андроиде?
19 фев 21, 11:51    [22283351]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4987
Sergey_rb,

Какое исключение-то? Если аппаратное, то смотрти доку.
19 фев 21, 11:58    [22283358]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Sergey_rb
Member

Откуда:
Сообщений: 956
Вот такое исключение

  try
    INI := TINIFile.Create('test.ini');
  except on e: exception do
    ShowMessage(e.Message);
  end;
19 фев 21, 12:18    [22283373]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
rgreat
Member

Откуда:
Сообщений: 6563
Kazantsev Alexey,

Интересно что им помешало сделать невидимый фиктивный вызов функции внутри try/except на анроиде?
19 фев 21, 12:20    [22283377]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4987
Sergey_rb
Вот такое исключение

Класc какой?

rgreat
Интересно что им помешало сделать невидимый фиктивный вызов функции внутри try/except на анроиде?

Видимо то же, что помешало и оптимизации ллвм'овские использовать. Это, кстати, не только ведроида касается, а вообще всех некстгенов.
19 фев 21, 12:26    [22283382]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Sergey_rb
Member

Откуда:
Сообщений: 956
Kazantsev Alexey
Sergey_rb
Вот такое исключение

Класc какой?

rgreat
Интересно что им помешало сделать невидимый фиктивный вызов функции внутри try/except на анроиде?

Видимо то же, что помешало и оптимизации ллвм'овские использовать. Это, кстати, не только ведроида касается, а вообще всех некстгенов.


Класс
TINIFile
19 фев 21, 12:27    [22283384]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Sergey_rb
Member

Откуда:
Сообщений: 956
rgreat
Kazantsev Alexey,

Интересно что им помешало сделать невидимый фиктивный вызов функции внутри try/except на анроиде?


Чтобы на Дельфи не писали, а переходили на Андроид студию.
19 фев 21, 12:28    [22283386]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
rgreat
Member

Откуда:
Сообщений: 6563
Kazantsev Alexey
Видимо то же, что помешало и оптимизации ллвм'овские использовать.

Ну оптимизации могут в теории и всякие сбои давать. Да и и так не высокую скорость работы компилятора снизить.
Могли это на потом оставить. Это все не столь важно, в общем.

А вот ненадежная работа try/except это явная и заведомая ошибка архитектора.

Сообщение было отредактировано: 19 фев 21, 12:28
19 фев 21, 12:32    [22283394]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Sergey_rb
Member

Откуда:
Сообщений: 956
Говорят, что до версии ведроида 6.0 try/except работал, значит умышленно убрали.
19 фев 21, 12:35    [22283397]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4987
Sergey_rb
Класс
TINIFile

Класс исключения.

rgreat
А вот костыль с try/except это явное заведомое упущение.

К слову, ни Oxygene, ни FPC c LLVM бэкендом такие исключения тоже не перехватывают, но в FPC эта задача значится в списке.
19 фев 21, 12:56    [22283417]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4987
Sergey_rb
Говорят, что до версии ведроида 6.0 try/except работал, значит умышленно убрали.

https://stackoverflow.com/questions/38243473/exception-handling-broken-in-delphi-xe8-android
19 фев 21, 12:59    [22283422]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
rgreat
Member

Откуда:
Сообщений: 6563
Kazantsev Alexey,

Типа в 10.4 пофиксили?
19 фев 21, 13:09    [22283434]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4987
rgreat
Типа в 10.4 пофиксили?

Не, там о другом.
19 фев 21, 13:16    [22283440]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Sergey_rb
Member

Откуда:
Сообщений: 956
В общем надо решать вопрос, на чем писать для терминала сбора данных для Андроида.
19 фев 21, 13:48    [22283486]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 729
http://docwiki.embarcadero.com/RADStudio/Sydney/en/Migrating_Delphi_Code_to_Mobile_from_Desktop
раздел Use a Function Call in a try-except Block to Prevent Uncaught Hardware Exceptions

т.е. вместо

  try
    INI := TINIFile.Create('test.ini');
  except on e: exception do
    ShowMessage(e.Message);
  end;

делаешь
  procedure T;
  begin
    INI := TINIFile.Create('test.ini');
  end;
   
  try
    T;
  except on e: exception do
    ShowMessage(e.Message);
  end;
19 фев 21, 15:17    [22283534]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Sergey_rb
Member

Откуда:
Сообщений: 956
asutp2,

Не прокатило, вылетел без сообщений

procedure TForm1.btnOkClick(Sender: TObject);
begin
  try
    LoadINI;
  except on e: exception do
    ShowMessage(e.Message);
  end;
end;

procedure TForm1.LoadINI;
var
  INI: TINIFile;
begin
    INI := TINIFile.Create('test.ini');
end;


Сообщение было отредактировано: 19 фев 21, 16:00
19 фев 21, 15:32    [22283546]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 729
Sergey_rb,

отучитесь на андроиде использовать ShowMessage
19 фев 21, 15:49    [22283554]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Sergey_rb
Member

Откуда:
Сообщений: 956
asutp2
Sergey_rb,

отучитесь на андроиде использовать ShowMessage


Почему?
Сам по себе ShowMessage работает.
19 фев 21, 16:01    [22283563]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
inbox
Member [заблокирован]

Откуда:
Сообщений: 17
Я бы запустил проект под отладкой, и посмотрел почему не срабатывает исключение.


Без отладки вообще нечего делать, это как тыкать писей в пруд(Может поймаешь рыбку).

Сообщение было отредактировано: 19 фев 21, 15:55
19 фев 21, 16:02    [22283564]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Sergey_rb
Member

Откуда:
Сообщений: 956
inbox
Я бы запустил проект под отладкой, и посмотрел почему не срабатывает исключение.


Без отладки вообще нечего делать, это как тыкать писей в пруд(Может поймаешь рыбку).


Исключение не срабатывает из-за версий Delphi и Android.
19 фев 21, 16:06    [22283569]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
попробуйте так
uses FMX.Helpers.Android;

procedure TTestForm.ShowInformationMessage(const AText: string);
  CallInUiThread (
        procedure
        begin
          TJToast.JavaClass.makeText (TAndroidHelper.Context,
              StrToJCharSequence(AText), TJToast.JavaClass.LENGTH_LONG).show;
        end
  );
end;


Сообщение было отредактировано: 19 фев 21, 16:27
19 фев 21, 16:31    [22283588]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 729
Sergey_rb,

а кстати, какая именно версия делфи используется?)
19 фев 21, 16:33    [22283590]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
inbox
Member [заблокирован]

Откуда:
Сообщений: 17
Sergey_rb

Исключение не срабатывает из-за версий Delphi и Android.


Что такое исключение ? Давайте разберёмся для начало в этом.

Простой пример
uses
  System.SysUtils;

begin
  try
    Raise Exception.Create('Test Exception');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.


Отладчик говорит
Project1.dpr.11: Raise Exception.Create('Test Exception');
0041E5A4 B940E64100       mov ecx,$0041e640
0041E5A9 B201             mov dl,$01
0041E5AB A130344100       mov eax,[$00413430]
0041E5B0 E847AAFFFF       call Exception.Create
0041E5B5 E84A85FEFF       call @RaiseExcept



То есть, создаётся класс, и вызывается RaiseExcept


По сути, нам надо отследить, что происходит при вызове

procedure _RaiseAtExcept(Obj: TObject; Address: Pointer);
var
  Params: Array[0..6] of NativeUInt;
  ExceptionRecord: TExceptionRecord;
  //CurRaiseFrame: PRaiseFrame;
begin
  if Obj = nil then
    _RunError(216); // reAccessViolation

  Params[0] := UIntPtr(Address);
  Params[1] := UIntPtr(Pointer(Obj));
  Params[2] := 0 {EBX};
  Params[3] := 0 {ESI};
  Params[4] := 0 {EDI};
  Params[5] := 0 {EBP};
  Params[6] := 0 {ESP};

  if RaiseExceptObjProc <> nil then
  begin
    //CurRaiseFrame := RaiseListPtr;
    ExceptionRecord.ExceptionCode := cDelphiException;
    ExceptionRecord.ExceptionFlags := cNonContinuable;
    ExceptionRecord.ExceptionRecord := nil;
//  if CurRaiseFrame <> nil then
//    ExceptionRecord.ExceptionRecord := CurRaiseFrame^.ExceptionRecord;
    ExceptionRecord.ExceptionAddress := Address;
    ExceptionRecord.NumberParameters := 7;
    ExceptionRecord.ExceptionInformation[0] := Params[0];
    ExceptionRecord.ExceptionInformation[1] := Params[1];
    ExceptionRecord.ExceptionInformation[2] := Params[2];
    ExceptionRecord.ExceptionInformation[3] := Params[3];
    ExceptionRecord.ExceptionInformation[4] := Params[4];
    ExceptionRecord.ExceptionInformation[5] := Params[5];
    ExceptionRecord.ExceptionInformation[6] := Params[6];
    TRaiseExceptObjProc(RaiseExceptObjProc)(@ExceptionRecord);
  end;
  RaiseExceptionProc(cDelphiException, cNonContinuable, 7, @Params);
end;
19 фев 21, 16:49    [22283601]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
Sergey_rb
Member

Откуда:
Сообщений: 956
asutp2
Sergey_rb,

а кстати, какая именно версия делфи используется?)


Delphi 8
Android 7.0

В первом посте написано...
19 фев 21, 16:52    [22283603]     Ответить | Цитировать Сообщить модератору
 Re: Не работает try except на Андроиде 7.0  [new]
rgreat
Member

Откуда:
Сообщений: 6563
Sergey_rb
Delphi 8
Что-что?!
19 фев 21, 16:55    [22283605]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить