• 0
haword

Raise убивает программу для Android

Вопросы

например raise EArgumentOutOfRangeException.CreateRes(@SArgumentOutOfRange) полностью закрывает приложение на Android. Можно как ни будь отловить вообще любой вызов raise и не дать программе закрыться? 

До Application.OnException не доходит. 

Изменено пользователем haword

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 ответов на этот вопрос

  • 0

разработчики? кто ни будь что ни будь скажет по этому поводу? Можно же как то переписать FM что бы при ошибке не просто закрывалась программа а хотя бы в лог Android писала причину своего закрытия? Ибо под Win програма не закрывается а сообщает об ошибке. А под Android просто схлопывается и все. В отладке ошибки уперся в процедуру SignalConverter в System.Internal.ExcUtils после нее идет циклическая ошибка, я так понял сама процедура вызывает ошибку, вызывает саму себя и так по кругу в отладчике а потом схлопывается. 

 

На все остальные глюки FM можно было бы закрыть глаза если бы программы от ошибок не закрывались молча. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

На сколько я заметил, программа "схлопывается" молча тогда, когда ошибка возникает в момент когда ее нельзя отобразить на экране. Что мешает поместить блок в try finally/except?

Изменено пользователем xenon54

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

в том то и дело что возникла ошибка внутри компонента ListView, в XE7 происходит ошибка если крутнуть список в ListView и пока он едет что то ввести в поле фильтра SearchBox. То есть эту ситуацию не обработать try except, я пытался даже перехватить через Application.OnException но ошибка валит программу до того как туда что то перейдет. В этом то вся проблема. 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Не знаю связано ли это с версией, я использую 8, у меня такого бага не наблюдается, который вы описали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В ХЕ8 это исправили. Я это исправление перенес в XE7.

 

Но в XE8 я уперся в другой баг, не с того не с сего подвисала форма. вешалась мертво ничего не сделать и процессор на планшете в 100% уходил. в XE7 тот же код работал НО иногда вываливал Access Violation причем ошибка то есть то нет. Но не подвисала форма со 100% загрузкой процессора. Под Вин все нормально было. Так что ждем-с XE8 SP1 :) и попробую заново. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
У кого убивается, а у кого висит черный экран ))) (XE7)

 

 

черный экран при запуске только если что то пошло не так. а так во время работы черного экрана ни разу не было. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ничего  в XE8 не исправили, или не для всех
 

try

raise exception.create('bla-bla-bla');

exception

end;

вышибает программу. Но, опять же, не на всех устройствах. Xiaomi Redmi 3S валит, LG L50 - отрабатывает и едет дальше

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

На настоящий момент в XE10.1 ситуация сохранилась. Samsung GT-N7100 , 4.4.2 программа молча вылетает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 1

У Эмбы есть описание подобной проблемы: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Migrating_Delphi_Code_to_Mobile_from_Desktop, раздел Use a Function Call in a try-except Block to Prevent Uncaught Hardware Exceptions

условно говоря, код, который может вызвать аппаратное исключение, нужно вызывать из другой процедуры, и исключение ловить уже там. Это справедливо не только для iOS, но для андроида тоже.

пример:

procedure InternalG1;
begin 
  try
    // что то, приводящее к исключению
  except
    // здесь обработчик по факту игнорируется
  end;
end;

procedure G1;
begin
  try
    InternalG1;
  except
    // здесь обработчик корректно обработает исключение
  end;
end;

А вообще у Grijjy team есть хорошая библиотека обработки необработанных исключений для андроида и иоса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Просто возьмите это под свой контроль - не используйте встроенный SearchBox, а создайте отдельное поле TEdit, а фильтрацию обрабатывайте руками.

  TListViewFilterEx = record
    Category : String;
    Name : String;
    Cart : String;
  end;

procedure TFormMain.SearchBoxChangeTracking(Sender: TObject);
begin
  Setting.Filter.Name:=SearchBox.Text;
  ListViewFilterEx(ListViewAction, Setting.Filter);
  LoadVisibleListViewItem(ListViewAction);
end;

procedure TFormMain.ListViewFilterEx(AListView : TListView; AFilter : TListViewFilterEx);
begin
  AListView.Items.FilterEx:=
    function(X: TListItem): Boolean
    begin
      Result:=
        (AFilter.Category.IsEmpty or TListViewItem(X).Data['Category'].AsString.ToLower.Contains(AFilter.Category.ToLower)) And
         ((AFilter.Name.IsEmpty or TListViewItem(X).Data['Name'].AsString.ToLower.Contains(AFilter.Name.ToLower)) or
         (AFilter.Name.IsEmpty or TListViewItem(X).Data['Detail'].AsString.ToLower.Contains(AFilter.Name.ToLower)));
    end;
end;

procedure TFormMain.LoadVisibleListViewItem(const AListView : TListView; ATopItemIndex : Integer = -1);
Var LTopItemIndex, I : Integer;
begin
  if Setting.Flags.ListViewActionLoaded then
  begin
    if ATopItemIndex=-1 then
      LTopItemIndex:=GetListViewTopItemIndex(AListView)
    else
      LTopItemIndex:=ATopItemIndex;
    for I := LTopItemIndex to LTopItemIndex + LoadVisibleListViewItemCount do
      if I<=AListView.ItemCount-1 then
      begin
        AListView.Adapter.ResetView(AListView.Items.Item[I]);
      end;
  end;
end;

Суффикс Ex в AListView.Items.FilterEx игнорируйте, используйте AListView.Items.Filter. Это я для нормального поиска (по всем полям и Data, а не только по Text) переписывал исходники ListView...

С таким кодом возможно у вас будет больше возможностей для перехвата исключения. Ну или игнорирования поиска пока работает скролл ListView.

Изменено пользователем Евгений Корепов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу