proglog

主にプログラミングに関する断片的メモ

GacuheのDBアクセスと例外処理

いわゆるtry-catch-finallyみたいな感じでデータ−ベースコネクションをクローズしようとしたら、guard構文にdynamic-windというのを使うんだろうか。

(use dbi)
(use gauche.collection)

(let ((conn #f) (query #f) (result #f))
  (guard (e ((<dbi-error> e)
	     ;; handle error
	     ))
    (dynamic-wind (lambda () )
	(lambda ()
	  (set! conn   (dbi-connect "dbi:mysql:test;host=dbhost"))
	  (set! query  (dbi-prepare conn "SELECT id, name FROM users"))
	  (set! result (dbi-execute query))
	    ;; something to process result
	    result)
	(lambda ()
	  (dbi-close result)
	  (dbi-close query)
	  (dbi-close conn)))))

これだと非常に手続き的だけど、他に書き方はないかな。