2012-05-04 47 views
3

我有一个很简单的问题,我想,但没办法找出错误。 我想打开一个文件,并尝试失败,如果该文件不存在或其他东西的自定义消息。OCaml语法错误,让...在

这里我的代码(对不起,法国评论):

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 
     () 
    ; 
;; 

我有一个语法错误的关键词中。 Someont有一个想法?谢谢。

回答

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 
    () 
+0

这不会起作用,因为«输入»有类型in_channel而不是单元。 – Thomash

+0

我已经指出,OP应该知道如何让两个'if/else'分支返回相同的类型。 – pad

0

你的问题是,你的代码什么都不做,你定义了值«输入»但不使用它,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( “不可能D'ouvrir乐fichier” ^文件名),我不认为»因为它引发了一个不会被捕获的异常。你已经抓住了它,打印错误消息并退出:

    (print_endline ("Impossible d'ouvrir le fichier "^filename); exit 1) 
    
  2. 您应该使用«开始»和«结束»