-class warner =
- object
- method warn w =
- print_endline ("WARNING: " ^ w) ;
- (raise Warnings : unit)
- end
-;;
-
-exception EmptyUri of string;;
+ (** tries to recover from a parse error caused by the parsing of a getter
+ * error message (e.g. Key_not_found exception). Unfortunately we have to
+ * re-parse xml document to extract exception data *)
+let try_recover exn filename =
+ let rc = ref None in
+ (try
+ let entity_manager =
+ Pxp_ev_parser.create_entity_manager ~is_document:true
+ PxpHelmConf.pxp_config (Pxp_types.from_file filename)
+ in
+ let pull_parser =
+ Pxp_ev_parser.create_pull_parser PxpHelmConf.pxp_config
+ (`Entry_document []) entity_manager
+ in
+ let rec find_exn p =
+ match p () with
+ | None -> ()
+ | Some (Pxp_types.E_start_tag ("html", attrs, _, _)) ->
+ let exn = List.assoc "helm:exception" attrs in
+ let arg =
+ try List.assoc "helm:exception_arg" attrs with Not_found -> ""
+ in
+ rc := Some (Getter_failure (exn, arg))
+ | _ -> find_exn p
+ in
+ find_exn pull_parser
+ with _ -> raise (Parser_failure (Printexc.to_string exn)));
+ match !rc with
+ | None -> raise (Parser_failure (Printexc.to_string exn))
+ | Some exn -> raise exn