From: Jonathan Nieder <jrnieder@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Stefan Beller <sbeller@google.com>,
git@vger.kernel.org, Michael Haggerty <mhagger@alum.mit.edu>,
Jeff King <peff@peff.net>
Subject: [PATCH/RFC] doc: document error handling functions and conventions (Re: [PATCH 03/14] copy_fd: pass error message back through a strbuf)
Date: Wed, 3 Dec 2014 19:01:33 -0800 [thread overview]
Message-ID: <20141204030133.GA16345@google.com> (raw)
In-Reply-To: <xmqqzjb4h823.fsf@gitster.dls.corp.google.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Junio C Hamano wrote:
> Jonathan Nieder <jrnieder@gmail.com> writes:
>> -extern int copy_fd(int ifd, int ofd);
>> +extern int copy_fd(int ifd, int ofd, struct strbuf *err);
>
> It is not limited to this single function, but what contract do we
> envision this "error messages are given back to the caller via
> strbuf" convention should give between the callers and the callee?
Here's a draft for documentation on that.
Documentation/technical/api-error-handling.txt | 75 ++++++++++++++++++++++++++
1 file changed, 75 insertions(+)
create mode 100644 Documentation/technical/api-error-handling.txt
diff --git a/Documentation/technical/api-error-handling.txt b/Documentation/technical/api-error-handling.txt
new file mode 100644
index 0000000..fc68db1
--- /dev/null
+++ b/Documentation/technical/api-error-handling.txt
@@ -0,0 +1,75 @@
+Error reporting in git
+======================
+
+`die`, `usage`, `error`, and `warning` report errors of various
+kinds.
+
+- `die` is for fatal application errors. It prints a message to
+ the user and exits with status 128.
+
+- `usage` is for errors in command line usage. After printing its
+ message, it exits with status 129. (See also `usage_with_options`
+ in the link:api-parse-options.html[parse-options API].)
+
+- `error` is for non-fatal library errors. It prints a message
+ to the user and returns -1 for convenience in signaling the error
+ to the caller.
+
+- `warning` is for reporting situations that probably should not
+ occur but which the user (and Git) can continue to work around
+ without running into too many problems. Like `error`, it
+ returns -1 after reporting the situation to the caller.
+
+Customizable error handlers
+---------------------------
+
+The default behavior of `die` and `error` is to write a message to
+stderr and then exit or return as appropriate. This behavior can be
+overridden using `set_die_routine` and `set_error_routine`. For
+example, "git daemon" uses set_die_routine to write the reason `die`
+was called to syslog before exiting.
+
+Library errors
+--------------
+
+Functions return a negative integer on error. Details beyond that
+vary from function to function:
+
+- Some functions return -1 for all errors. Others return a more
+ specific value depending on how the caller might want to react
+ to the error.
+
+- Some functions report the error to stderr with `error`,
+ while others leave that for the caller to do.
+
+- errno is not meaningful on return from most functions (except
+ for thin wrappers for system calls).
+
+Check the function's API documentation to be sure.
+
+Caller-handled errors
+---------------------
+
+An increasing number of functions take a parameter 'struct strbuf *err'.
+On error, such functions append a message about what went wrong to the
+'err' strbuf. The message is meant to be complete enough to be passed
+to `die` or `error` as-is. For example:
+
+ if (ref_transaction_commit(transaction, &err))
+ die("%s", err.buf);
+
+The 'err' parameter will be untouched if no error occured, so multiple
+function calls can be chained:
+
+ t = ref_transaction_begin(&err);
+ if (!t ||
+ ref_transaction_update(t, "HEAD", ..., &err) ||
+ ret_transaction_commit(t, &err))
+ die("%s", err.buf);
+
+The 'err' parameter must be a pointer to a valid strbuf. To silence
+a message, pass a strbuf that is explicitly ignored:
+
+ if (thing_that_can_fail_in_an_ignorable_way(..., &err))
+ /* This failure is okay. */
+ strbuf_reset(&err);
next prev parent reply other threads:[~2014-12-04 3:01 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-17 22:14 [PATCH] copy.c: make copy_fd preserve meaningful errno Stefan Beller
2014-11-17 23:08 ` Junio C Hamano
2014-11-17 23:13 ` Stefan Beller
2014-11-17 23:35 ` Jonathan Nieder
2014-11-18 0:18 ` Stefan Beller
2014-11-18 0:48 ` Jonathan Nieder
2014-11-18 1:01 ` Stefan Beller
2014-12-03 5:02 ` [PATCH 0/14] " Jonathan Nieder
2014-12-03 5:10 ` [PATCH 01/14] strbuf: introduce strbuf_prefixf() Jonathan Nieder
2014-12-03 20:10 ` Eric Sunshine
2014-12-03 20:14 ` Jonathan Nieder
2014-12-03 21:45 ` Junio C Hamano
2014-12-03 21:59 ` Jonathan Nieder
2014-12-03 22:09 ` Jonathan Nieder
2014-12-03 22:40 ` Junio C Hamano
2014-12-03 5:12 ` [PATCH 02/14] add_to_alternates_file: respect GIT_OBJECT_DIRECTORY Jonathan Nieder
2014-12-03 18:53 ` Junio C Hamano
2014-12-03 5:13 ` [PATCH 03/14] copy_fd: pass error message back through a strbuf Jonathan Nieder
2014-12-03 19:01 ` Junio C Hamano
2014-12-03 20:28 ` Jonathan Nieder
2014-12-03 21:00 ` Jeff King
2014-12-03 21:38 ` Jonathan Nieder
2014-12-04 7:59 ` Jeff King
2014-12-04 8:36 ` Stefan Beller
2014-12-04 9:04 ` Jeff King
2014-12-10 17:02 ` Michael Haggerty
2014-12-10 19:00 ` Junio C Hamano
2014-12-10 19:14 ` Jeff King
2014-12-04 3:01 ` Jonathan Nieder [this message]
2014-12-04 23:27 ` [PATCH/RFC] doc: document error handling functions and conventions (Re: [PATCH 03/14] copy_fd: pass error message back through a strbuf) Junio C Hamano
2014-12-04 23:37 ` Jonathan Nieder
2014-12-04 23:41 ` Jonathan Nieder
2014-12-04 23:44 ` Jeff King
2014-12-04 23:52 ` Junio C Hamano
2014-12-05 0:01 ` Jeff King
2014-12-05 18:00 ` Junio C Hamano
2014-12-07 10:07 ` Jeff King
2014-12-09 18:43 ` Junio C Hamano
2014-12-09 18:49 ` Jeff King
2015-02-12 23:08 ` Junio C Hamano
2015-02-17 15:50 ` Michael Haggerty
2015-02-17 16:03 ` Junio C Hamano
2015-02-17 16:05 ` Jeff King
2015-02-17 22:46 ` Junio C Hamano
2014-12-03 20:02 ` [PATCH 03/14] copy_fd: pass error message back through a strbuf Junio C Hamano
2014-12-03 20:18 ` Jonathan Nieder
2014-12-03 21:43 ` Junio C Hamano
2014-12-03 21:51 ` Jonathan Nieder
2014-12-03 20:20 ` Stefan Beller
2014-12-03 5:14 ` [PATCH 04/14] hold_lock_file_for_append: " Jonathan Nieder
2014-12-03 6:09 ` Torsten Bögershausen
2014-12-03 7:04 ` Jonathan Nieder
2014-12-03 5:16 ` [PATCH 05/14] lock_packed_refs: " Jonathan Nieder
2014-12-03 5:19 ` [PATCH 06/14] lockfile: introduce flag for locks outside .git Jonathan Nieder
2014-12-03 23:13 ` Junio C Hamano
2014-12-03 23:24 ` Jonathan Nieder
2014-12-03 23:25 ` Junio C Hamano
2014-12-03 23:29 ` Jonathan Nieder
2014-12-03 23:38 ` Junio C Hamano
2014-12-03 23:41 ` Jonathan Nieder
2014-12-03 23:43 ` Junio C Hamano
2014-12-03 23:57 ` Jeff King
2014-12-04 5:51 ` Junio C Hamano
2014-12-04 17:56 ` Jonathan Nieder
2014-12-03 5:19 ` [PATCH 07/14] fast-import: use message from lockfile API when writing marks fails Jonathan Nieder
2014-12-03 5:20 ` [PATCH 08/14] credentials: use message from lockfile API when locking ~/.git-credentials fails Jonathan Nieder
2014-12-03 5:21 ` [PATCH 09/14] config: use message from lockfile API when locking config file fails Jonathan Nieder
2014-12-03 19:59 ` Junio C Hamano
2014-12-03 20:16 ` Jonathan Nieder
2014-12-03 5:22 ` [PATCH 10/14] rerere: error out on autoupdate failure Jonathan Nieder
2014-12-03 5:25 ` [PATCH 11/14] hold_locked_index: pass error message back through a strbuf Jonathan Nieder
2014-12-03 5:26 ` [PATCH 12/14] hold_lock_file_for_update: " Jonathan Nieder
2014-12-03 18:53 ` Jonathan Nieder
2014-12-03 5:26 ` [PATCH 13/14] lockfile: remove unused function 'unable_to_lock_die' Jonathan Nieder
2014-12-03 5:27 ` [PATCH 14/14] lockfile: make 'unable_to_lock_message' private Jonathan Nieder
2014-12-03 20:42 ` Stefan Beller
2014-11-18 16:32 ` [PATCH] copy.c: make copy_fd preserve meaningful errno Junio C Hamano
2014-11-18 17:08 ` Junio C Hamano
2014-11-21 9:14 ` Michael Haggerty
2014-11-21 9:17 ` Michael Haggerty
2014-11-21 17:48 ` Junio C Hamano
2014-11-21 17:54 ` Jeff King
2014-11-21 18:31 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141204030133.GA16345@google.com \
--to=jrnieder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=mhagger@alum.mit.edu \
--cc=peff@peff.net \
--cc=sbeller@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).