[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 02/44] error: Document Error API usage rules
From: |
Markus Armbruster |
Subject: |
[PATCH v2 02/44] error: Document Error API usage rules |
Date: |
Thu, 2 Jul 2020 17:49:18 +0200 |
This merely codifies existing practice, with one exception: the rule
advising against returning void, where existing practice is mixed.
When the Error API was created, we adopted the (unwritten) rule to
return void when the function returns no useful value on success,
unlike GError, which recommends to return true on success and false on
error then.
When a function returns a distinct error value, say false, a checked
call that passes the error up looks like
if (!frobnicate(..., errp)) {
handle the error...
}
When it returns void, we need
Error *err = NULL;
frobnicate(..., &err);
if (err) {
handle the error...
error_propagate(errp, err);
}
Not only is this more verbose, it also creates an Error object even
when @errp is null, &error_abort or &error_fatal.
People got tired of the additional boilerplate, and started to ignore
the unwritten rule. The result is confusion among developers about
the preferred usage.
The written rule will hopefully reduce the confusion.
The remainder of this series will update a substantial amount of code
to honor the rule.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
---
include/qapi/error.h | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/include/qapi/error.h b/include/qapi/error.h
index 3e64324b7a..5ceb3ace06 100644
--- a/include/qapi/error.h
+++ b/include/qapi/error.h
@@ -15,6 +15,32 @@
/*
* Error reporting system loosely patterned after Glib's GError.
*
+ * Rules:
+ *
+ * - Functions that use Error to report errors have an Error **errp
+ * parameter. It should be the last parameter, except for functions
+ * taking variable arguments.
+ *
+ * - You may pass NULL to not receive the error, &error_abort to abort
+ * on error, &error_fatal to exit(1) on error, or a pointer to a
+ * variable containing NULL to receive the error.
+ *
+ * - The value of @errp should not affect control flow.
+ *
+ * - On success, the function should not use @errp. On failure, it
+ * should set a new error, e.g. with error_setg(errp, ...), or
+ * propagate an existing one, e.g. with error_propagate(errp, ...).
+ *
+ * - Whenever practical, also return a value that indicates success /
+ * failure. This can make the error checking more concise, and can
+ * avoid useless error object creation and destruction. Note that
+ * we still have many functions returning void. We recommend
+ * • bool-valued functions return true on success / false on failure,
+ * • pointer-valued functions return non-null / null pointer, and
+ * • integer-valued functions return non-negative / negative.
+ *
+ * How to:
+ *
* Create an error:
* error_setg(errp, "situation normal, all fouled up");
*
--
2.26.2
- [PATCH v2 00/44] Less clumsy error checking, Markus Armbruster, 2020/07/02
- [PATCH v2 02/44] error: Document Error API usage rules,
Markus Armbruster <=
- [PATCH v2 04/44] macio: Tidy up error handling in macio_newworld_realize(), Markus Armbruster, 2020/07/02
- [PATCH v2 11/44] qemu-option: Replace opt_set() by cleaner opt_validate(), Markus Armbruster, 2020/07/02
- [PATCH v2 09/44] qemu-option: Simplify around find_default_by_name(), Markus Armbruster, 2020/07/02
- [PATCH v2 13/44] qemu-option: Use returned bool to check for failure, Markus Armbruster, 2020/07/02
- [PATCH v2 01/44] error: Improve examples in error.h's big comment, Markus Armbruster, 2020/07/02
- [PATCH v2 08/44] qemu-option: Factor out helper find_default_by_name(), Markus Armbruster, 2020/07/02
- [PATCH v2 21/44] qom: Use error_reportf_err() instead of g_printerr() in examples, Markus Armbruster, 2020/07/02