Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Sergey_rb Member Откуда: Сообщений: 956 |
Delphi 8 (RAD) Не работает try except на Андроиде 7.0 При возникновении ошибки приложение вылетает без сообщения. Есть какие-то варианты ловить ошибку на Андроиде? |
19 фев 21, 11:51 [22283351] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Sergey_rb, Какое исключение-то? Если аппаратное, то смотрти доку. |
19 фев 21, 11:58 [22283358] Ответить | Цитировать Сообщить модератору |
Sergey_rb Member Откуда: Сообщений: 956 |
Вот такое исключениеtry INI := TINIFile.Create('test.ini'); except on e: exception do ShowMessage(e.Message); end; |
19 фев 21, 12:18 [22283373] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
Kazantsev Alexey, Интересно что им помешало сделать невидимый фиктивный вызов функции внутри try/except на анроиде? |
19 фев 21, 12:20 [22283377] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Класc какой?
Видимо то же, что помешало и оптимизации ллвм'овские использовать. Это, кстати, не только ведроида касается, а вообще всех некстгенов. |
||||||||
19 фев 21, 12:26 [22283382] Ответить | Цитировать Сообщить модератору |
Sergey_rb Member Откуда: Сообщений: 956 |
Класс TINIFile |
||||||||||||
19 фев 21, 12:27 [22283384] Ответить | Цитировать Сообщить модератору |
Sergey_rb Member Откуда: Сообщений: 956 |
Чтобы на Дельфи не писали, а переходили на Андроид студию. |
||||
19 фев 21, 12:28 [22283386] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
Ну оптимизации могут в теории и всякие сбои давать. Да и и так не высокую скорость работы компилятора снизить. Могли это на потом оставить. Это все не столь важно, в общем. А вот ненадежная работа try/except это явная и заведомая ошибка архитектора. Сообщение было отредактировано: 19 фев 21, 12:28 |
||||
19 фев 21, 12:32 [22283394] Ответить | Цитировать Сообщить модератору |
Sergey_rb Member Откуда: Сообщений: 956 |
Говорят, что до версии ведроида 6.0 try/except работал, значит умышленно убрали. |
19 фев 21, 12:35 [22283397] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Класс исключения.
К слову, ни Oxygene, ни FPC c LLVM бэкендом такие исключения тоже не перехватывают, но в FPC эта задача значится в списке. |
||||||||
19 фев 21, 12:56 [22283417] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
https://stackoverflow.com/questions/38243473/exception-handling-broken-in-delphi-xe8-android |
||||
19 фев 21, 12:59 [22283422] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
Kazantsev Alexey, Типа в 10.4 пофиксили? |
19 фев 21, 13:09 [22283434] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Не, там о другом. |
||||
19 фев 21, 13:16 [22283440] Ответить | Цитировать Сообщить модератору |
Sergey_rb Member Откуда: Сообщений: 956 |
В общем надо решать вопрос, на чем писать для терминала сбора данных для Андроида. |
19 фев 21, 13:48 [22283486] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
asutp2 Member Откуда: Тюмень Сообщений: 729 |
Sergey_rb, отучитесь на андроиде использовать ShowMessage |
19 фев 21, 15:49 [22283554] Ответить | Цитировать Сообщить модератору |
Sergey_rb Member Откуда: Сообщений: 956 |
Почему? Сам по себе ShowMessage работает. |
||||
19 фев 21, 16:01 [22283563] Ответить | Цитировать Сообщить модератору |
inbox Member [заблокирован] Откуда: Сообщений: 17 |
Я бы запустил проект под отладкой, и посмотрел почему не срабатывает исключение. Без отладки вообще нечего делать, это как тыкать писей в пруд(Может поймаешь рыбку). Сообщение было отредактировано: 19 фев 21, 15:55 |
19 фев 21, 16:02 [22283564] Ответить | Цитировать Сообщить модератору |
Sergey_rb Member Откуда: Сообщений: 956 |
Исключение не срабатывает из-за версий Delphi и Android. |
||||
19 фев 21, 16:06 [22283569] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
asutp2 Member Откуда: Тюмень Сообщений: 729 |
Sergey_rb, а кстати, какая именно версия делфи используется?) |
19 фев 21, 16:33 [22283590] Ответить | Цитировать Сообщить модератору |
inbox Member [заблокирован] Откуда: Сообщений: 17 |
Что такое исключение ? Давайте разберёмся для начало в этом. Простой пример 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] Ответить | Цитировать Сообщить модератору |
Sergey_rb Member Откуда: Сообщений: 956 |
Delphi 8 Android 7.0 В первом посте написано... |
||||
19 фев 21, 16:52 [22283603] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
|
||||
19 фев 21, 16:55 [22283605] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Delphi | ![]() |