English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
Question about try.. with
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2007-02-18 (00:44)
From: Jon Harrop <jon@f...>
Subject: Re: [Caml-list] Question about try.. with
On Saturday 17 February 2007 23:40, christian konrad wrote:
> Hello list,
> I'm doing that:
> let _ =
>   try
>    let infile = open_in !filename in
>    let rec readIn () =
>       try
>          (input_line infile) ^ readIn();
>       with ee -> "";
>    in
>     print_string(readIn () );
>    "good";
>   with e -> "";;
> So why don't I get any output at all? Doesn't "with" erease the raised
> Exception?

You may get better/faster responses to this kind of question on the beginners 
list. Reading a file is a FAQ and the stdlib does little to help.

In this case, your code is probably stack overflowing due to too much 
recursion, raising the Stack_overflow exception which is then caught and the 
empty string returned.

To circumvent this problem (and the fact that repeated string concatenation is 
slow) you should write that function in the following style:

(* Boxed input_line *)
let try_input_line ch =
  try Some(input_line ch) with End_of_file -> None;;

(* Left fold over lines in a file. *)
let rec fold_lines f accu ch =
  match try_input_line ch with
  | None -> accu
  | Some string -> fold_lines f (f accu string) ch;;

(* Ensure that something is done after completion, whether or not an exception
   was raised. *)
let finally f x g y =
    let f_x = f x in
    g y;
  with exn ->
    g y;
    raise exn;;

(* Apply a function "k" to a file, ensuring that the file gets closed *)
let read file k =
  let ch = open_in file in
  finally k ch close_in ch;;

(* Read the lines of a file. *)
let _ =
  let lines = List.rev (read file (fold_lines (fun t h -> h::t) [])) in
  let file = String.concat "\n" lines in
  print_endline file;;

Dr Jon D Harrop, Flying Frog Consultancy Ltd.
OCaml for Scientists