如何在C#中处理和识别System.ArgumentOutOfRangeException?



我有一个使用C#的基于Xamarin的应用程序。我有一个页面EmployeeProfile.此页面列出了所有员工。有一个 API 调用,一次提供 10 条记录。当用户向下滚动和最后一项开始出现时,它会调用Loadmore方法调用另外 10 条记录的 API。

我使用 AppCenter 来跟踪错误和崩溃。检查实例时没有收到错误。但是,当我检查AppCenter崩溃报告时,此页面上有很多崩溃。

异常:ThrowHelper.ThrowArgumentOutOfRangeException (System.ExceptionArgument参数,System.ExceptionResource resource( System.ArgumentOutOfRangeException:索引超出范围。必须是 非负数且小于集合的大小。参数名称: 指数

错误看起来像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)

错误看起来像在getEmployeeProfile((方法中。任何人都可以建议我哪条线导致此问题....

根据您的堆栈跟踪,错误发生在以下行:

SearchEmployee.Add(new EmployeeProfile());

。我该如何预防?

原因似乎是尝试循环访问更改列表的绑定 UI 控件。若要获得更多帮助,必须包含绑定到此属性的设计代码或背后的代码。这是基于您发布的堆栈跟踪中的前 5 行。


在 UI 端,有一个列表视图。ListView 绑定到 SearchEmployee。有没有办法防止或处理它

看起来像一个报告的错误,请参阅错误 59974 - 具有可观察集合异步更新的列表视图中的参数超出范围异常。

最新更新