Как обрабатывать и идентифицировать System.ArgumentOutOfRangeException в C #? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть приложение на основе Xamarin, которое использует C #.У меня есть страница EmployeeProfile.На этой странице перечислены все сотрудники.Существует вызов API, который обеспечивает 10 записей одновременно.Когда пользователь прокручивает страницу вниз и когда появляется последний элемент, он вызывает метод Loadmore, который вызывает API для еще 10 записей.

Я использую AppCenter для отслеживания ошибок и сбоев.Я не получаю ошибку, когда проверяю свой экземпляр.Однако, когда я проверяю отчет о сбоях в AppCenter, на этой странице много сбоев.

Исключение: ThrowHelper.ThrowArgumentOutOfRangeException (аргумент System.ExceptionArgument, ресурс System.ExceptionResource) System.ArgumentOutOfRangeException: индекс находится вне диапазона.Должен быть неотрицательным и меньшим, чем размер коллекции.Имя параметра: index

Ошибка выглядит как в методе getEmployeeProfile().Кто-нибудь может подсказать, какая линия вызывает эту проблему и как я могу ее предотвратить?Если предотвращение невозможно, как я могу справиться с этим?

Код:

publish SearchEmployeeResultsViewModel
{
    public ObservableRangeCollection<EmployeeProfile> SearchEmployee { get; set; }
    public List<EmployeeProfile> ListSearchEmployee { get; set; }
    public bool IsNoDataFound { get; set; }
    public int currentPage { get; set; }
    public int recordCount { get; set; }
    public bool IsBusy { get; set; }

    //constructor
    public SearchEmployeeResultsViewModel()
    {
        currentPage = 0;
        recordCount = 10;
        getEmployeeProfile();
    }

    //Call when user scroll down for more EmployeeProfiles
    //Following method call when last item start to visible(ListView event)
    private async Task LoadMore()
    {
        IsBusy = true;
        await getEmployeeProfile();
        IsBusy = false;
    }

    //Except/Crash raised from here
    private async Task getEmployeeProfile()
    {
        currentPage++;
        //Remove last item if it has no username
        //Purpose: We add blank item at end to manage smooth scrolling while getting next page data
        if (SearchEmployee.Count > 0 && SearchEmployee.Last().UserName == null)
            SearchEmployee.RemoveAt(SearchEmployee.Count() - 1);

        ListSearchEmployee.AddRange((await _profileApiClient.SearchEmployeeCall(currentPage, recordCount)));

        var differenceList = ListSearchEmployee.Except(SearchEmployee).ToList();

        if (differenceList.Count > 0)
        {
            SearchEmployee.AddRange(differenceList);
            //add blank item
            SearchEmployee.Add(new EmployeeProfile());
        }
        IsNoDataFound = (SearchEmployee == null || SearchEmployee.Count() == 0);
    }
}

Трассировка стека ошибок:

ThrowHelper.ThrowArgumentOutOfRangeException (System.ExceptionArgument argument, System.ExceptionResource resource)
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

    ThrowHelper.ThrowArgumentOutOfRangeException (System.ExceptionArgument argument, System.ExceptionResource resource)
    ThrowHelper.ThrowArgumentOutOfRangeException ()
    List`1[T].get_Item (System.Int32 index)
    Collection`1[T].get_Item (System.Int32 index)
    ReadOnlyCollection`1[T].get_Item (System.Int32 index)
    RendererPool.UpdateRenderers (Xamarin.Forms.Element newElement)
    RendererPool.UpdateNewElement (Xamarin.Forms.VisualElement newElement)
    VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement)
    VisualElementPackager.OnRendererElementChanged (System.Object sender, Xamarin.Forms.Platform.iOS.VisualElementChangedEventArgs args)
    VisualElementRenderer`1[TElement].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs`1[TElement] e)
    VisualElementRenderer`1[TElement].SetElement (TElement element)
    IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element)
    RendererPool.UpdateRenderers (Xamarin.Forms.Element newElement)
    RendererPool.UpdateNewElement (Xamarin.Forms.VisualElement newElement)
    VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement)
    VisualElementPackager.OnRendererElementChanged (System.Object sender, Xamarin.Forms.Platform.iOS.VisualElementChangedEventArgs args)
    VisualElementRenderer`1[TElement].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs`1[TElement] e)
    VisualElementRenderer`1[TElement].SetElement (TElement element)
    IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element)
    RendererPool.UpdateRenderers (Xamarin.Forms.Element newElement)
    RendererPool.UpdateNewElement (Xamarin.Forms.VisualElement newElement)
    VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement)
    VisualElementPackager.OnRendererElementChanged (System.Object sender, Xamarin.Forms.Platform.iOS.VisualElementChangedEventArgs args)
    VisualElementRenderer`1[TElement].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs`1[TElement] e)
    VisualElementRenderer`1[TElement].SetElement (TElement element)
    IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element)
    RendererPool.UpdateRenderers (Xamarin.Forms.Element newElement)
    RendererPool.UpdateNewElement (Xamarin.Forms.VisualElement newElement)
    VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement)
    VisualElementPackager.OnRendererElementChanged (System.Object sender, Xamarin.Forms.Platform.iOS.VisualElementChangedEventArgs args)
    VisualElementRenderer`1[TElement].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs`1[TElement] e)
    VisualElementRenderer`1[TElement].SetElement (TElement element)
    IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element)
    ViewCellRenderer+ViewTableCell.UpdateCell (Xamarin.Forms.ViewCell cell)
    ViewCellRenderer+ViewTableCell.set_ViewCell (Xamarin.Forms.ViewCell value)
    ViewCellRenderer.GetCell (Xamarin.Forms.Cell item, UIKit.UITableViewCell reusableCell, UIKit.UITableView tv)
    CustomViewCellRenderer.GetCell (Xamarin.Forms.Cell item, UIKit.UITableViewCell reusableCell, UIKit.UITableView tv)
    CellTableViewCell.GetNativeCell (UIKit.UITableView tableView, Xamarin.Forms.Cell cell, System.Boolean recycleCells, System.String templateId)
    ListViewRenderer+ListViewDataSource.GetCell (UIKit.UITableView tableView, Foundation.NSIndexPath indexPath)
    (wrapper managed-to-native) ObjCRuntime.Messaging:objc_msgSend (intptr,intptr)
    UITableView.EndUpdates ()
    ListViewRenderer.UpdateItems (System.Collections.Specialized.NotifyCollectionChangedEventArgs e, System.Int32 section, System.Boolean resetWhenGrouped)
    ListViewRenderer.OnCollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    TemplatedItemsList`2[TView,TItem].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    TemplatedItemsList`2[TView,TItem].OnProxyCollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e, System.Boolean fixWindows)
    TemplatedItemsList`2[TView,TItem].OnProxyCollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    ListProxy.OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    ListProxy+<>c__DisplayClass33_0.<OnCollectionChanged>b__0 ()
    ListProxy.OnCollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    ListProxy+WeakNotifyProxy.OnCollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    ObservableCollection`1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    ObservableRangeCollection`1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    ObservableCollection`1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedAction action, System.Object item, System.Int32 index)
    ObservableCollection`1[T].InsertItem (System.Int32 index, T item)
    Collection`1[T].Add (T item)
    SearchEmployeeResultsViewModel+<getEmployeeProfile>d__76.MoveNext ()
    ExceptionDispatchInfo.Throw ()
    TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task)
    TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task)
    TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task)
    TaskAwaiter.GetResult ()
    SearchEmployeeResultsViewModel+<LoadMore>d__75.MoveNext ()
    ExceptionDispatchInfo.Throw ()
    AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state)
    UIKitSynchronizationContext+<Post>c__AnonStorey0.<>m__0 ()
    NSAsyncActionDispatcher.Apply ()
    (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
    UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate)
    UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName)
    Application.Main (System.String[] args)

1 Ответ

0 голосов
/ 11 октября 2018

Ошибка выглядит как в методе getEmployeeProfile ().Кто-нибудь может предложить мне, какая строка вызывает эту проблему ....

На основе трассировки вашего стека происходит ошибка в этой строке:

SearchEmployee.Add(new EmployeeProfile());

..Как я могу предотвратить это?

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


На стороне пользовательского интерфейса есть ListView.ListView привязывается к SearchEmployee.Есть ли способ предотвратить или обработать это

Похоже на сообщенную ошибку, см. Ошибка 59974 - Исключение ArgumentOutOfRangeException в просмотре списка с асинхронными обновлениями ObservableCollection .

...