我是否应该从这种方法中抛出异常?

use*_*485 4 .net c# extension-methods exception

我正在一个方法中执行一些参数验证,并在必要时抛出异常.我是否需要手动抛出这种类型的异常?只要调用者被包装在try..catch块中,无论手动检查是否到位,都会抛出类似的异常.

    public static Int16 ToInt16(this byte[] value, int startIndex, bool isBigEndian) {

        // are these exceptions necessary?
        if (value == null) {
            throw new ArgumentNullException("value");
        }

        if ((startIndex + 1) >= value.Length) {
            throw new ArgumentOutOfRangeException("startIndex");
        }    

        return (isBigEndian)
            ? (Int16)((value[startIndex] << 8) | value[startIndex + 1])
            : (Int16)((value[startIndex + 1] << 8) | value[startIndex]);
    }
Run Code Online (Sandbox Code Playgroud)

这是一种扩展方法,用于将数组中的2个字节转换为Int16,以便切换Big Endian或Little Endian转换.

Pet*_*ert 9

在这里抛出异常的价值在于,您将获得一个参数异常,而不是获取null deref异常,最重要的是告诉您无效的参数.异常也更明确地指向原因,而不是通用的null deref,它可以是任何东西.

鉴于这是一个已经是一个间接层的扩展方法,我认为完成并包含异常可能更有用.特别是考虑到你已经写好了,但即使是政策问题.如果它不是扩展方法,我可以去任何一种方式.我也可以使用一个断言,取决于代码的埋藏方式.

我目前不知道,但在.Net 1.1和1.0框架中,JIT编译器永远不会内联一个抛出它的调用.为了避免这种情况,通常意味着创建一个不同的方法来抛出异常本身.

顺便说一句,你有一个错误的startIndex + 1> value.Length; 它应该是> =而不是.


Alf*_*ers 5

根据类库设计指南,您应该验证类型的公共成员的所有参数. http://msdn.microsoft.com/en-us/library/8ey5ey87(VS.71).aspx


更新:更新版本:http://msdn.microsoft.com/en-us/library/ms229007.aspx