我有时会编写假设某些参数不会发生的函数。如果他们这样做,这是一个错误,我失败了:
let foo = function
| 0 -> ()
| _ -> failwith "foo: bad argument"
如果我稍后重命名该功能,我必须记住也要更改字符串。有没有办法以更系统的方式做到这一点?我的思绪在像
这样的解决方案中徘徊| _ -> failwith (FUNCTION_NAME ^ ": bad argument")
其中FUNCTION_NAME
是编译器或解释器将实例化的字符串变量。但我不知道这样的事情是否适用于OCaml。如果没有,是否有最佳做法?
答案 0 :(得分:9)
有一组值可用于调试和错误报告。它们都不是函数名称,但如果您不想按@SteveVinoski的建议使用assert false
,它们可能会很有用。
__LOC__ : string
__FILE__ : string
__LINE__ : int
__MODULE__ : string
__POS__ : string * int * int * int
您还可以使用更好的表单来包装表达式以确定其在源中的范围。
这些内容记录在Pervasives模块中。
答案 1 :(得分:1)
我认为您应该尝试尽可能多地使用更具体的类型,以便编译器可以阻止您使用无效输入调用函数。
如果你真的找不到告诉类型系统你想要什么的方法,那就更加努力,如果你真的不能,那就用史蒂夫告诉你的assert
会给你一些宝贵的调试信息(文件和行号比函数名更有用,因为机会很高,你的函数没有名字)。