3

我认为我有一个非常简单的问题,但无法弄清楚出了什么问题。我想打开一个文件并尝试在文件不存在或其他情况下使用自定义消息失败。

这是我的代码(对不起法语评论):

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 关键字上有语法错误。有人有想法吗?谢谢。

4

2 回答 2

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
    ()
于 2012-05-04T11:42:25.500 回答
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;;

关于您的代码的其他说明:

  1. 我不认为你想使用 «failwith ("Impossible d'ouvrir le fichier " ^ filename)» 因为它会引发一个不会被捕获的异常。你已经抓住了它,所以打印一条错误消息并退出:

    (print_endline ("Impossible d'ouvrir le fichier " ^ filename); exit 1)
    
  2. 你应该使用«begin»和«end»

于 2012-05-04T13:02:30.970 回答