On Sat, Apr 27, 2013 at 5:19 PM, SASADA Koichi <ko1 / atdot.net> wrote: > (1) introduce new keyword? > > example: raise(..., cause: e) Yeah, that's not bad. Keywords allow us to avoid changing the signature in new/incompatible/non-forward-compatible ways. > (2) How about to use `$!' forcibly? Do you mean automatically stick $! into Exception#cause when creating (or perhaps better, when raising) a new Exception? That's not a bad idea. Interestingly, java.lang.Throwable also does not allow setting the cause. You can set it during init or after init *at most once*. Here's JavaDoc for it: http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html#initCause(java.lang.Throwable) I quote: "This method can be called at most once. It is generally called from within the constructor, or immediately after creating the throwable. If this throwable was created with Throwable(Throwable) or Throwable(String,Throwable), this method cannot be called even once." Java 7 also added an additional mechanism for attaching exceptions, called "supressed exceptions". http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html#addSuppressed(java.lang.Throwable) This mechanism was added for exceptions that are not really the *cause*, but which are related. For example, an IO read operation raises an error, and while handling that error and attempting to close the stream a second error is raised. The read error did not cause the close error, but you don't want to lose either. You raise the close error with the read error attached as "suppressed". I think for purposes of this feature, adding cause, which can be initialized during construction only, would be sufficient. I have no strong opinion about automatically using $! as the cause, but it might be nice.