gpt4 book ai didi

c# - 我应该为此方法抛出异常吗?

转载 作者:太空狗 更新时间:2023-10-29 23:55:49 24 4
gpt4 key购买 nike

我在方法中执行一些参数验证并在必要时抛出异常。我需要手动抛出这种类型的异常吗?只要调用方包含在 try..catch block 中,就会抛出类似的异常,而不管手动检查是否到位。

    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]);
}

这是一种扩展方法,用于将数组中的 2 个字节转换为 Int16,并可切换大端或小端转换。

最佳答案

这里抛出异常的值(value)在于,你将得到一个参数异常,而不是得到一个 null deref 异常,最重要的是它告诉你参数是无效的。异常也比可以是任何东西的通用 null deref 更明确地指向原因。

鉴于这是一个已经是一级间接的扩展方法,我认为完整并包含异常可能更有用。特别是考虑到您显然已经编写了它,但即使是作为政策问题。如果它不是一种扩展方法,我可以采用任何一种方式。我也可能会使用断言来代替,具体取决于代码的隐藏程度。

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

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

关于c# - 我应该为此方法抛出异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1352789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com