虽然这个回答有写跑题,我还是想问,题主你为什么要这么检测错误?应该是在使用slice之前检查一下容量是否足够,而不是已经出错了再去补救。

如果是随手写的程序,应该也不需要捕获,出错了重新启动就好。

go语言不推荐使用panic/recover机制当作异常。不要将java里的异常使用经验带到go语言里。

如何判断是不是该使用异常?如果判断了recover返回的具体类型,尤其是这个类型还是一个公开的类型(首字母大写),那基本上可以确定不应该使用recover机制。

题主在回复里给出了更加明确的细节,明确了问题意图是如何很好的控制程序错误,这里回复一下:


这个方法的可变参数nums的类型为[]int,对其长度的判断可以使用len。在使用时应当先检查是否有足够的元素数量。如果数量不够,又是一种需要让调用者明确知道的错误类型,可以自定义一个基于函数行为的错误类型。


以下为针对

@唐生

回答的反驳:

不认为你的回答针对了题主的情况,反而还会误导。

题主显然是要捕获一个可以识别的错误,这个错误并不能通过自定义error来解决。如何自定义一个语言层面的越界error呢?

至于go标准库里的异常使用,绝大部分的异常使用都是出现在某种编码解码的场合。由于并不限制用户输入,会使用异常来保证程序正常返回。换句话说,这些地方捕获的是异常,是超出设计之外的情况,而不是设计中会遇到的流程错误。使用这个来证明panic/recover的使用情景,和题主的情况是完全不一致的。这些场景下并不需要非常明确知道到底是什么类型。