Re: [Vala] Wrapping Errors in the vala way



On Sat, 2009-08-22 at 21:03 +0200, Jan Hudec wrote:
On Sat, Aug 22, 2009 at 11:52:01 -0400, Yu Feng wrote:
On Sat, 2009-08-22 at 09:24 +0200, Jan Hudec wrote:
[...]
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.

I buy your point. 

In an language like Java, the error(Exception) carries more than a
message and a code. It also includes a source code reference therefore
it make sense to save the cause as an data member.

Nevertheless in the GObject case, because the error only carries an
code, and a message, there is no need to wrap the low level errors.
g_prefix_error would be sufficient as an substitute of 'wrapping'. How
can we invoke this function in vala though?

If you are wrapping an error, you don't need that function. Instead you
create a new error and use the inner error's message as one of the arguments
for the message format string.

The purpose of g_prefix_error is somewhat different. It's used to add context
to the error without wrapping it. For example if you are accessing file and
the function that detects the error only has a stream, the calling function
might prefix it with the filename to indicate where the error happened.

I think it would make sense to add it to the GError class in glib-2.0.vapi --
if you find you have good use for it, just add it there and post a patch.

By the way, you should be suggesting things like this on the Gtk list, not
here.

I thought it was a GObject feature which was highly relevant to Vala.

Important goal of vala is to interoperate well with non-vala gobject code. So
features like this would need to be added to glib.


Thank you! g_prefix_error is not what I want. This is what I want:

-----
errordomain Exception {
        HOMEWORK_NOT_FOUND
}
errordomain Execuse {
        I_WAS_SICK
}

public static void main() {
        try {
                grade();
        } catch(Exception e) {
                stdout.printf("Could not grade: %s\n", e.message);
        }
}

private void obtain_homework_from_student() throws Execuse {
        throw new Execuse.I_WAS_SICK("I was sick");
}

private void grade() throws Exception {
        try {
                obtain_homework_from_student();
        } catch (Execuse execuse) {
                throw new Exception.HOMEWORK_NOT_FOUND("Homework not found: %s",
                        execuse.message);
        }
}
--------------------

Yu




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]