【发布时间】:2013-11-28 06:46:19
【问题描述】:
所以我有一些我想要的东西,在一个 try 块中,将各种数据添加到某个数据对象,然后在抛出异常的情况下,保存带有错误的记录以及在异常之前检索到的所有数据字段.在 Java 中,这很容易。即使您使用某种不可变类型的记录,您也可以这样做:
MyRecord record = new MyRecord();
try {
record = record.withA(dangerouslyGetA());
record = record.withB(dangerouslyGetB());
record = record.withC(dangerouslyGetC());
} catch (Exception ex) {
record = record.withError(ex);
}
save(record);
所以如果它在步骤 C 发生炸弹,那么它会保存 A、B 和错误的记录。
我想不出在 Clojure 中执行此操作的任何直接方法。如果您将try 放在let 周围,那么您必须将记录的“更新”分配给每个新变量,因此它们不在catch 表达式的范围内。即使它们是,您也不知道该使用哪一个。
我想我可以在每个表达式周围放置一个 try/catch/let,但这比 Java 版本的代码要多得多,并且需要在任何地方复制 save 语句。我的理解是 Clojure 因其简洁性和易于避免重复而非常出色,所以有些事情让我认为这是错误的做法。
当然,这是一个相当普遍的需求,并且有一个简单的惯用解决方案,对吧?
【问题讨论】:
标签: clojure