Manipulação de exceção da OCAML para abrir o canal de entrada
-
25-09-2019 - |
Pergunta
Como iniciante na OCAML, tenho esse código de trabalho atual:
...
let ch_in = open_in input_file in
try
proc_lines ch_in
with End_of_file -> close_in ch_in;;
Agora eu gostaria de adicionar o manuseio de erros para arquivos de entrada inexistentes, escrevi isso:
let ch_in = try Some (open_in input_file) with _ -> None in
match ch_in with
| Some x -> try proc_lines x with End_of_file -> close_in x
| None -> () ;;
e receba uma mensagem de erro: Esse padrão corresponde aos valores do tipo 'a opção, mas é aqui usado para corresponder a valores do tipo exn para a última linha. Se eu substituir Nenhum por _, Recebo um erro sobre a correspondência incompleta.
Eu li que exn é o tipo de exceção. Tenho certeza de que não entendo o que realmente está acontecendo aqui, então me aponte para a direção certa. Obrigado!
Solução
Ao incorporar o padrão de incorporação em outras correspondências de padrões, você precisa envolver a correspondência incorporada com qualquer um ( ... )
ou begin ... end
(açúcar sintático para parênteses):
let ch_in = try Some (open_in input_file) with _ -> None in
match ch_in with
| Some x -> (try proc_lines x with End_of_file -> close_in x)
| None -> () ;;