On Thu, 2009-09-03 at 13:38 +0100, Phil Housley wrote:
> 2009/8/22 Jan Hudec <[email protected]>:
> > On Thu, Aug 20, 2009 at 22:09:21 -0400, Yu Feng wrote:
> >> GError doesn't support error wrapping as Java does. Is GLib is purposely
> >> avoiding it?
> >> If not, it will become a useful feature as the number of libraries that
> >> uses GError grows, as the feature has already been proved useful in
> >> Java, (indicated in this article):
> >>
> >> http://tutorials.jenkov.com/java-exception-handling/exception-wrapping.html
> >
> > Actually, in my opinion that article nicely explains, why you do *not* need
> > to have the original error information there.
>
> In Java, this feature is actually used a lot, and can be incredibly
> helpful. A common example goes:
>
> void dbaccess() {
> throw new DatabaseError();
> }
>
> void sometransaction() throws FailedToCompleteError {
> if (bad data) throw new FailedToCompleteError();
> try {
> dbaccess();
> } catch(DatabaseError e) {
> // this is still a failure to complete
> throw new FailedToCompleteError(e);
> }
> }
>
> void abusinessfunction() throws FailedToCompleteError {
> try {
> sometransaction();
> } catch(FailedToCompleteError e) {
> // unroll operation or whatever
> throw e;
> }
> }
>
> void main() {
> try {
> usebusinessfunction();
> } catch(FailedToCompleteError e) {
> // hmm, what went wrong, should we give up (database) or try again
> (bad data)
> }
> }
>
> The reason this doesn't map so well onto Vala/GError, is that
> something like DatabaseError would probably be unchecked, and so could
> trickle through the stack without handlers being invoked to do things
> like unrolling transactions. The aim here is to insulate the business
> function from having know that the database even exists, while still
> letting it know whether the transaction was completed. Wrapping the
> error preserves the information for the application, or whatever
> integration layer actually knows how the stack is set up.
>
In vala, to wrap up errors one can always do(because the essence part of
the error in Vala is merely the .message field):
private void dbaccess() throws DBError(e) {
throw new DBError.ACCESS_FAILED("db access failed");
}
public void sometransaction() throws TransactionError {
try {
dbaccess();
} catch(DBError e) {
throw new TransactionError.FAILED_COMPLETE("Failed to complete:
%s",
e.message);
}
}
public void somebusiness() throws BusinessError {
try {
sometransaction();
} catch(TransactionError e) {
throw new BusinessError.FAILED_TRANSACTION("Business Failed:
%s",
e.message);
}
}
I hope I understood what you were trying to say.
Yu
> > article> The main reason one would use exception wrapping is to prevent the
> > article> code further up the call stack from having to know about every
> > article> possible exception in the system.
> >
> > Well, so the code further up the call stack is not going to look at the
> > inner exception anyway except to print it to the operator, right? But for
> > that, it's enough to embed the wrapped error's message into the wrapping
> > error message. The error code is not relevant.
> >
> > By the way, you should be suggesting things like this on the Gtk list, not
> > here.
> >
> > --
> > Jan 'Bulb' Hudec
> > <[email protected]>
> > _______________________________________________
> > Vala-list mailing list
> > [email protected]
> > http://mail.gnome.org/mailman/listinfo/vala-list
> >
>
_______________________________________________
Vala-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/vala-list