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

如何断言函数抛出异常?及检测函数未按预期抛异常的方法

检测函数未抛出预期异常的方法
  • 核心思路:要判断函数是否未抛出预期异常,只需检查它是否正常返回——如果函数执行后没有进入异常分支,就说明不符合预期。

基础实现(手动检测)

可以通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:50:17