You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:54:40