如何处理 ArgumentOutOfRangeException [重复]
Posted
技术标签:
【中文标题】如何处理 ArgumentOutOfRangeException [重复]【英文标题】:How to handle ArgumentOutOfRangeException [duplicate] 【发布时间】:2017-03-06 20:07:35 【问题描述】:我有一个通用 ListManager 类,它的方法返回特定索引处的对象。我正在检查索引是否在范围内以避免异常。索引超出范围怎么办?我试图返回 null 但这是不可能的。我想在不使用 try catch 的情况下做到这一点。有什么建议吗?
public T GetAt<T>(int index)
if (index <= list.Count() - 1)
return list[index];
else
return null; //This will not compile
【问题讨论】:
您的类型T
可能不是nullable
.. 你为什么不抛出一个新的ArgumentOutOfRangeException
?在通过的地方处理错误输入是合法的......
if (index < list.Count())
稍微干净一些:)
【参考方案1】:
对于 ref 类型,您可以返回 default(T)
它是 null
。但是对于值类型,您将返回一些默认值,例如 int 为 0。也许它就是你想要的。
【讨论】:
listmanager 将用于 value 和 ref 类型。如何同时处理这两种选择? 你不能为值类型返回 null :) 所以要么返回默认值,要么只是抛出异常并捕获它。那是您的应用程序,我不知道,如果没有具有此索引的项目会发生什么【参考方案2】:为了在索引超出范围时返回null
,您可以为值和引用类型编写2个版本
public class ValMgr<T> where T : struct
public List<T> list;
public T? GetAt(int index, T? defv = null)
if (index < list.Count)
return list[index] as T?;
return defv;
还有
public class RefMgr<T> where T : class
public List<T> list;
public T GetAt(int index, T defv = null)
// don't reinvent the wheel
T ret = list.ElementAtOrDefault(index) as T;
return (ret == null) ? defv : ret;
演示用法
var m = new ValMgr<int>();
m.list = new List<int>() 1 ;
var test1 = m.GetAt(0); // 1
var test2 = m.GetAt(1); // null
var test2bis = m.GetAt(1,-1); // -1
var n = new RefMgr<string>();
n.list = new List<string>() "1" ;
var test3 = n.GetAt(0); // "1"
var test4 = n.GetAt(1); // null
var test4bis = n.GetAt(1,"--"); // --
但请注意,您始终可以使用标准 Linq ElementAtOrDefault 如果您只想为引用类型返回 null
并为值类型返回 default
值。
【讨论】:
【参考方案3】:通常,对于像这样的通用方法,您希望调用者知道他们向您的方法传递了一个无效值。由于该类型不可为空,因此正确的做法是向调用者抛出异常。您可以不理会它,让 ArgumentOutOfRangeException 冒泡返回给调用者。或者,如果您想使用自己的自定义异常类型或消息,您将捕获 ArgumentOutOfRangeException,并实例化您自己的异常,将 Inner Exception 设置为您捕获的 ArgumentOutOfRangeException。
如果你不想使用try/catch,你可以使用你现有的逻辑,但是在“else”部分,抛出你自己的异常,没有内部异常。
唯一的其他选择是返回默认值(t),但我不建议这样做。如果你这样做,那么方法的调用者将不知道他们试图访问一个无效值,并且可能会继续他们的快乐方式,相信他们返回的默认值(比如,0 表示 int 或 false 在bool 的情况)是存储在请求索引处的实际值,这很可能会导致其解决方案出现错误。
【讨论】:
以上是关于如何处理 ArgumentOutOfRangeException [重复]的主要内容,如果未能解决你的问题,请参考以下文章