OCaml异常处理疑问:divide_ten是否捕获divide_and_match的异常?
OCaml函数异常处理问题解答
先看给出的OCaml函数代码:
let divide_and_match x y = match y with | 0 -> raise (Failure "Division by zero") | _ -> x / y let divide_ten x y = match x with | 10 -> let result = divide_and_match x y in print_endline ("Result: " ^ string_of_int result) | _ -> failwith "Bad"
问题解答
除
Failure "Division by zero"外,divide_and_match抛出的其他异常是否会导致输出"Bad"?
不会。输出"Bad"的逻辑仅在divide_ten的match分支中x≠10时触发,通过failwith "Bad"生成。当x=10时,调用divide_and_match抛出的任何异常(无论类型是什么)都会直接向上传播,不会进入x≠10的分支,自然不会输出"Bad"。divide_ten函数是否会捕获divide_and_match抛出的任何异常?
不会。divide_ten中没有任何异常捕获代码(比如OCaml的try...with结构),当divide_and_match抛出异常时,该异常会直接穿过divide_ten,继续传递给调用divide_ten的上层代码,不会被divide_ten处理。match语句的异常处理机制
OCaml的match语句本质是模式匹配工具,本身不具备异常捕获能力:
- 它会将匹配对象与各个分支的模式逐一比对,匹配成功则执行对应分支代码;
- 如果执行分支代码过程中抛出异常,
match不会拦截或处理该异常,异常会直接向上传播; - 只有当匹配对象没有任何分支可以匹配时,
match才会自动抛出Match_failure异常,但这属于匹配失败的情况,不是处理已存在的异常。
内容的提问来源于stack exchange,提问作者penguin365
相关产品推荐
相关产品推荐

