例外処理

Rubyのensureに相当することは,OCamlではどうすればいいんだろう.
else節がある場合.(追記:間違ってたので修正)

# Ruby
begin
  a
rescue Error
  b
else
  c
ensure
  d
end
(* OCaml *)
try begin
  (try
     a
     c
   with
       Error -> b);
  d
end
with
    x -> d; raise x

else節がない場合.

# Ruby
begin
  a
rescue Error
  b
ensure
  d
end
(* OCaml *)
try
  a
  d
with
    Error -> b
  | x -> d; raise x);

こんな感じ?あんまり綺麗に書けてる気がしない.そもそもこれで合ってるのか?
Rubyだと一つのbeginで書けるのに,tryのネストとか出てきたりして嫌だなぁ.