如何断言函数抛出异常?及检测函数未按预期抛异常的方法
检测函数未抛出预期异常的方法
- 核心思路:要判断函数是否未抛出预期异常,只需检查它是否正常返回——如果函数执行后没有进入异常分支,就说明不符合预期。
基础实现(手动检测)
可以通过try-with结构捕获异常,若函数正常返回则触发错误逻辑:
let check_expected_exception expected_exn fn = try let _ = fn () in (* 正常返回,说明未抛出异常,不符合预期 *) failwith "函数未抛出预期的异常" with | e -> (* 可选:验证抛出的异常是否为预期类型/值 *) if e = expected_exn then print_endline "符合预期:抛出了指定异常" else failwith (Printf.sprintf "不符合预期:抛出了非指定异常: %s" (Printexc.to_string e))
使用示例:
(* 假设some_fn本应抛出Failure异常 *) check_expected_exception (Failure "invalid input") (fun () -> some_fn ())
如果some_fn正常返回,就会触发failwith提示错误;如果抛出的不是预期异常,也会给出对应提示。
测试框架中的用法(更规范)
如果是编写测试用例,比如使用OUnit测试框架,可以直接用框架提供的assert_raises断言:
open OUnit2 (* 测试用例:验证some_fn是否抛出预期异常 *) let test_some_fn_raises_exception _ = assert_raises (Failure "expected error") (fun () -> some_fn ()) (* 组装测试套件 *) let test_suite = "Function exception tests" >::: ["test some_fn raises expected exception" >:: test_some_fn_raises_exception] (* 运行测试 *) let () = run_test_tt_main test_suite
当some_fn未抛出预期异常时,测试会直接标记为失败,输出清晰的错误信息。
简化版:仅检测是否抛出任意异常
如果不需要验证具体异常类型,只需要确认函数是否抛出异常,可简化逻辑:
let check_any_exception fn = try let _ = fn () in failwith "函数未抛出任何异常" with | _ -> print_endline "函数成功抛出异常"
内容的提问来源于stack exchange,提问作者David 天宇 Wong
相关产品推荐
相关产品推荐

