From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> To: Leonid Vasiliev <lvasiliev@tarantool.org> Cc: tarantool-patches@dev.tarantool.org Subject: Re: [Tarantool-patches] [PATCH V4 1/6] error: add custom error type Date: Fri, 17 Apr 2020 02:49:21 +0200 [thread overview] Message-ID: <d4fff7d8-9e8c-069a-6507-25e3ea621c04@tarantool.org> (raw) In-Reply-To: <ac3fb9db4564a7fff412995019cdcef91867b425.1587058424.git.lvasiliev@tarantool.org> Thanks for the patch! See 2 comments below. On 16/04/2020 19:38, Leonid Vasiliev wrote: > Co-authored-by: Vladislav Shpilevoy<v.shpilevoy@tarantool.org> > > Part of #4398 > > @TarantoolBot document > Title: Custom error types for Lua errors > > Errors can be created in 2 ways: `box.error.new()` and `box.error()`. > > Both used to take either `code, reason, <reason string args>` or > `{code = code, reason = reason, ...}` arguments. > > Now in the first option instead of code a user can specify a > string as its own error type. In the second option a user can > specify both code and type. For example: > > ```Lua > box.error('MyErrorType', 'Message') > box.error({type = 'MyErrorType', code = 1024, reason = 'Message'}) > ``` > Or no-throw version: > ```Lua > box.error.new('MyErrorType', 'Message') > box.error.new({type = 'MyErrorType', code = 1024, reason = 'Message'}) > ``` > When a custom type is specified, it is shown in `err.type` > attribute. When it is not specified, `err.type` shows one of > built-in errors such as 'ClientError', 'OurOfMemory', etc. > > Name length limit on the custom type is 63 bytes. All is longer > is truncated. 1. I changed 'All is longer' -> 'All what is longer'. Force pushed. > diff --git a/extra/exports b/extra/exports > index a9add2c..9467398 100644 > --- a/extra/exports > +++ b/extra/exports > @@ -235,6 +235,7 @@ box_index_min > box_index_max > box_index_count > box_error_type > +box_error_custom_type > box_error_code > box_error_message > box_error_last > diff --git a/src/box/errcode.h b/src/box/errcode.h > index d1e4d02..e37b7bd 100644 > --- a/src/box/errcode.h > +++ b/src/box/errcode.h > @@ -266,6 +266,7 @@ struct errcode_record { > /*211 */_(ER_WRONG_QUERY_ID, "Prepared statement with id %u does not exist") \ > /*212 */_(ER_SEQUENCE_NOT_STARTED, "Sequence '%s' is not started") \ > /*213 */_(ER_NO_SUCH_SESSION_SETTING, "Session setting %s doesn't exist") \ > + /*214 */_(ER_CUSTOM_ERROR, "%s") \ 2. We discussed that with Alexander - what to do with error codes. Because there are 3 options: - CustomErrors don't have a code. Only type name. Code will be added later as a part of payload. In that case the syntax: box.error.new({code = 123, type = 'MyType'}) becomes illegal. 'error.code' returns nil in Lua for CustomError objects. And CustomError should not be a descendant of ClientError in our code. - CustomError has a code, it is always 214. Syntax with custom error code is banned too. But 'error.code' is 214 always. Which is weird. 214 is a very strange number, and it creates an unnecessary link with box.error.* codes, which are valid only for ClientErrors. - CustomError has a code and a user can choose it. By default it is 0. Now the patch is neither of this. You allow to specify code in box.error.new() and box.error(), but it is silently ignored and replaced with 214. From what I understand, Alexander wants one of the versions above. Certainly not the one where we ignore code argument in box.error.new() and box.error() functions. I am for the last option. So when you write box.error.new({code = 123, type = 'MyType'}) You can take 'error.code' and it is 123. That is the simplest solution in terms of implementation, and the simplest in terms of the API. Because you have single format for all errors: {type = ..., code = ..., reason = ...} Where type and code are optional. If we go for any other option, we will need to split it in 2 versions: either {type = ..., reason = ...} or {code = ..., reason = ...} One can argue, that error codes can intersect, but the thing is that ClientError and CustomError are different types for a user. box.error.* codes are valid only and only for ClientError objects. Moreover, even now I can specify not existing codes when create a ClientError object. So intersection argument does not work - codes can intersect even now. And it seems to be not a problem. Just consider this example: tarantool> args = {code = 214, reason = 'Message'} --- ... tarantool> err = box.error.new(args) --- ... tarantool> err:unpack() --- - code: 214 base_type: ClientError type: ClientError message: Message trace: - file: '[string "err = box.error.new(args)"]' line: 1 ... I created a ClientError with code 214. Not CustomError. ClientError. It means, that code is never going to be enough to detect error type. You will never be able to compare code with 214, and if they are equal, say that it is CustomError. The example above proves it is not true. You always need to look at error type first. Therefore it makes no sense to ban codes for CustomErrors. It won't protect from anything.
next prev parent reply other threads:[~2020-04-17 0:49 UTC|newest] Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-04-16 17:38 [Tarantool-patches] [PATCH V4 0/6] Extending error functionality Leonid Vasiliev 2020-04-16 17:38 ` [Tarantool-patches] [PATCH V4 1/6] error: add custom error type Leonid Vasiliev 2020-04-17 0:49 ` Vladislav Shpilevoy [this message] 2020-04-18 17:14 ` lvasiliev 2020-04-16 17:38 ` [Tarantool-patches] [PATCH V4 2/6] error: send custom type in IProto Leonid Vasiliev 2020-04-17 0:51 ` Vladislav Shpilevoy 2020-04-16 17:38 ` [Tarantool-patches] [PATCH V4 3/6] session: add offset to SQL session settings array Leonid Vasiliev 2020-04-16 17:38 ` [Tarantool-patches] [PATCH V4 4/6] error: add session setting for error type marshaling Leonid Vasiliev 2020-04-16 19:48 ` Konstantin Osipov 2020-04-17 0:51 ` Vladislav Shpilevoy 2020-04-17 7:35 ` Konstantin Osipov 2020-04-16 17:38 ` [Tarantool-patches] [PATCH V4 5/6] error: update constructors of some errors Leonid Vasiliev 2020-04-16 17:38 ` [Tarantool-patches] [PATCH V4 6/6] error: add error MsgPack encoding Leonid Vasiliev 2020-04-17 0:58 ` Vladislav Shpilevoy 2020-04-18 17:46 ` lvasiliev 2020-04-17 0:51 ` [Tarantool-patches] [PATCH V4 0/6] Extending error functionality Vladislav Shpilevoy
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=d4fff7d8-9e8c-069a-6507-25e3ea621c04@tarantool.org \ --to=v.shpilevoy@tarantool.org \ --cc=lvasiliev@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH V4 1/6] error: add custom error type' \ /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
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox