如何处理 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 &lt; 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 UsernameNotFoundException 春季安全

如何处理c#中的错误代码

Akka 如何处理消息版本?

开玩笑测试 - 如何处理 JsonWebToken 响应

如何处理 JSON 响应

“不知道如何处理' nvcc 致命错误