我认为我有一个非常简单的问题,但无法弄清楚出了什么问题。 我想打开一个文件并尝试使用自定义消息失败,如果该文件不存在或其他原因。
这是我的代码(对不起法国评论):
if (argc = 1) then
aide ()
else
(* Si plus d'un argument, on récupère le type *)
if argc >= 2 then
let stage = int_of_string (Sys.argv.(1)) in
if stage != 0 && stage != 1 then
aide ()
else
()
else
()
;
(* Si plus de deux arguments, on récupère aussi l'entrée *)
if argc >= 3 then
let filename = Sys.argv.(2) in
let input =
try
open_in filename
with _ -> failwith ("Impossible d'ouvrir le fichier " ^ filename)
else
()
;
;;
我在with关键字上出现语法错误。 有人有想法吗?感谢。
答案 0 :(得分:4)
发生错误是因为您将input
绑定到某个值但未在then
分支中返回任何内容。
您应该使用值input
执行某些操作,并在()
阻止后返回try/with
。
if argc >= 3 then
let filename = Sys.argv.(2) in
let input = (* The error is in this line *)
try
open_in filename
with _ -> failwith ("Impossible d'ouvrir le fichier " ^ filename)
else
()
答案 1 :(得分:0)
你的问题是你的代码什么都不做,你定义了值«input»但是没有使用它,Ocaml不喜欢什么都不做的代码。你应该写这样的东西:
if (argc = 1) then
aide ()
else begin
(* Si plus d'un argument, on récupère le type *)
if argc >= 2 then
let stage = int_of_string (Sys.argv.(1)) in
if stage != 0 && stage != 1 then
aide ()
else
()
else
()
;
(* Si plus de deux arguments, on récupère aussi l'entrée *)
if argc >= 3 then
let filename = Sys.argv.(2) in
let input =
try
open_in filename
with _ -> failwith ("Impossible d'ouvrir le fichier " ^ filename)
in
(* Le code principal du programme qui utilise la valeur input *)
else
()
;
end;;
您的代码的其他评论:
我认为你不想使用«failwith(“Impossible d'ouvrir le fichier”^ filename)»因为它会引发一个不会被捕获的异常。您已经抓住它,因此打印错误消息并退出:
(print_endline ("Impossible d'ouvrir le fichier " ^ filename); exit 1)
您应该使用«开始»和«结束»