F#中使用kprintf格式化异常字符串时如何获取冗余参数警告?
实现带冗余参数警告的自定义异常格式化函数
你自己写的MyException.Raise没有冗余参数警告,核心原因是msg参数没被约束为格式化字符串类型——F#编译器没法识别它是需要匹配参数的模板,自然不会做参数校验。而failwithf之所以能触发警告,是因为它的参数类型是Printf.StringFormat<'a>,编译器会基于这个类型检查参数数量和占位符是否匹配。
要解决这个问题,只需要给Raise的msg参数显式指定格式化字符串类型,让编译器介入校验:
type MyException (s:string) = inherit System.Exception(s) static member Raise (msg: Printf.StringFormat<'a>) = Printf.kprintf (fun s -> raise (MyException(s))) msg do MyException.Raise "boom %d" 9 1 // 现在会触发冗余参数警告 failwithf "boom %d" 9 1 // 依然保留警告
这样修改后,编译器会像处理failwithf一样,解析格式化字符串里的占位符,检查后续传入的参数数量、类型是否匹配,多余的参数就会触发警告。这种方式完全兼容旧版本F#,不需要依赖新的$格式化语法。
内容的提问来源于stack exchange,提问作者Goswin R
相关产品推荐
相关产品推荐

