Documentation for error handling#259
Documentation for error handling#259NickNaso wants to merge 7 commits intonodejs:masterfrom NickNaso:master
Conversation
Changed version of node-addon-api on the package.json example see: [issue 206](#206 (comment))
| section). | ||
|
|
||
| If C++ exceptions are enabled (for more info see: [Setup](setup.md) section), | ||
| then the **Error** class extends ```std::exception``` and enables integrated |
There was a problem hiding this comment.
For single line code I think you can just use a single backtick.
There was a problem hiding this comment.
I will provide to remove where necessary.
|
|
||
| ### Constructor | ||
|
|
||
| Initializes a ```Error``` instance from an existing ```Error``` object. |
There was a problem hiding this comment.
I've been wresting with how to describe this, maybe "from an existing JavaScript Error object." The description as it stands sounds more like a copy constructor when it seems like this would be used more for JavaScript objects which have been acquired elsewhere.
| void ThrowAsJavaScriptException() const; | ||
| ``` | ||
|
|
||
| Throw the error as JavaScript exception. |
There was a problem hiding this comment.
Nit: I would move this above where the description normally goes and then update it to say "Throws"
| ``` | ||
|
|
||
| Returns a pointer to a null-terminated string that is used to identify the | ||
| exception. This method can be used only if the eceptions mechanis is enabled. No newline at end of file |
There was a problem hiding this comment.
nit: "exception mechanism"
There was a problem hiding this comment.
I think this file is also missing
static NAPI_NO_RETURN void Fatal(const char* location, const char* message);
|
|
||
| You are reading a draft of the next documentation and it's in continuos update so | ||
| if you don't find what you need please refer to: | ||
| [C++ wrapper classes for the ABI-stable C APIs for Node.js](https://nodejs.github.io/node-addon-api/) No newline at end of file |
There was a problem hiding this comment.
What is our feeling about this? I've seen some of the documentation updates leave it, but maybe it's the right time to start removing these designations.
/cc @mhdawson
There was a problem hiding this comment.
That was my thought, once we fill in the section lets remove the comment.
There was a problem hiding this comment.
Replied above at this point I'd say take it out.
| You are reading a draft of the next documentation and it's in continuos update so | ||
| if you don't find what you need please refer to: | ||
| [C++ wrapper classes for the ABI-stable C APIs for Node.js](https://nodejs.github.io/node-addon-api/) No newline at end of file | ||
| The error handling represents one of the most important thing on implementing a |
There was a problem hiding this comment.
nit: "Error handling represents one of the most important considerations when implementing a Node.js native add-on."
| The error handling represents one of the most important thing on implementing a | ||
| Node.js native add-on. When an error occurs in your C++ code you have to handle | ||
| and dispatch it correctly. **N-API** uses return values and JavaScript exceptions | ||
| for error handling. You can choice one method or other based on your preferences |
There was a problem hiding this comment.
nit: "You can choose return values or exception handling based on the mechanism that works best for your add-on."
|
|
||
| The **Error** is a persistent reference (for more info see: [Object reference](object_reference.md) | ||
| section) to a JavaScript error object. Use of this class depends somewhat on | ||
| whether C++ exceptions are enabled at compile time. |
There was a problem hiding this comment.
nit: avoid "somewhat", we want to be as descriptive as possible. If there are more nuances we should try to enumerate them.
| The following sections explain the approach for each case: | ||
|
|
||
| - [Handling Errors With C++ Exceptions](#exceptions) | ||
|
|
There was a problem hiding this comment.
nit: I don't think this extra newline is necessary here
| - [Handling Errors Without C++ Exceptions](#noexceptions) | ||
|
|
||
| <a name="exceptions"></a> | ||
|
|
There was a problem hiding this comment.
I'm using markdownlint and it reports
[markdownlint] MD022/blanks-around-headers: Headers should be surrounded by blank lines
but if you want I can remove the extra space. Maybe in general we need to have a standard to follow.
| You are reading a draft of the next documentation and it's in continuos update so | ||
| if you don't find what you need please refer to: | ||
| [C++ wrapper classes for the ABI-stable C APIs for Node.js](https://nodejs.github.io/node-addon-api/) No newline at end of file | ||
| The **Error** class is a representation of the JavaScript Error object that is thrown |
There was a problem hiding this comment.
Do we have a guideline for these sorts of stylistic flairs? It seems like Error and Error are used in different scenarios throughout this file, what is the guideline we're following?
There was a problem hiding this comment.
No at moment we haven't a stylistic standard to follow. My opinion is that we need one.
|
|
||
| Following C++ statements will not be executed. The exception will bubble up as a | ||
| C++ exception of type **Error**, until it is either caught while still in C++, or | ||
| else automatically propataged as a JavaScript exception when returns to |
There was a problem hiding this comment.
nit: "C++ statements following the throwing statement will not be executed. The exception throw is of type Error and can be handled in C++ as usual. If the exception is not handled in C++ it will automatically propagate to the JavaScript caller.
| exception. | ||
|
|
||
| <a name="noexceptions"></a> | ||
|
|
There was a problem hiding this comment.
Maybe an example that shows rethrowing ?
| ## Handling Errors Without C++ Exceptions | ||
|
|
||
| If C++ exceptions are disabled (for more info see: [Setup](setup.md) section), | ||
| then the **Error** class does not extend ```std::exception```. This means that |
There was a problem hiding this comment.
nit: extra space after "Error"
|
|
||
| If C++ exceptions are disabled (for more info see: [Setup](setup.md) section), | ||
| then the **Error** class does not extend ```std::exception```. This means that | ||
| any call to node-addon-api functions does not throw C++ exception. |
There was a problem hiding this comment.
nit: "any calls to node-addon-api function do not throw C++ exceptions."
| Initializes a ```Error``` instance from an existing ```Error``` object. | ||
|
|
||
| ```cpp | ||
| TypeError(napi_env env, napi_value value); |
There was a problem hiding this comment.
I think this is a typo, should be Error instead of TypeError.
| Initializes a ```Error``` instance from an existing ```Error``` object. | ||
|
|
||
| ```cpp | ||
| TypeError(napi_env env, napi_value value); |
There was a problem hiding this comment.
Believe this should Error not TypeError
|
|
||
| - [Handling Errors Without C++ Exceptions](#noexceptions) | ||
|
|
||
| <a name="exceptions"></a> |
There was a problem hiding this comment.
? wondering why there is html here
There was a problem hiding this comment.
This is to create an anchor with a friendly name that's not affected by changes to the name of the header. The same approach is used in the official CHANGELOG
There was a problem hiding this comment.
ok, just have not see it in other docs.
| If C++ exceptions are enabled (for more info see: [Setup](setup.md) section), | ||
| then the **Error** class extends ```std::exception``` and enables integrated | ||
| error-handling for C++ exceptions and JavaScript exceptions. | ||
|
|
There was a problem hiding this comment.
If C++ exceptions are enabled then exceptions are converted and handled as C++ exceptions while in native code and as JavaScript exceptions in JavaScript code. What this means is that:
and then make the following bullet points:
|
|
||
| If a JavaScript function called by C++ code via N-API throws a JavaScript | ||
| exception, then the N-API wrapper automatically converts and throws it as a C++ | ||
| exception of type **Error**. |
There was a problem hiding this comment.
on return from the JavaScript code to the native method.
| exception, then the N-API wrapper automatically converts and throws it as a C++ | ||
| exception of type **Error**. | ||
|
|
||
| If a C++ exception of type **Error** escapes from a N-API C++ callback, then |
There was a problem hiding this comment.
On return from a native method, N-API will automatically convert a pending C++ exception to a JavaScript exception.
| If a C++ exception of type **Error** escapes from a N-API C++ callback, then | ||
| the N-API wrapper automatically converts and throws it as a JavaScript exception. | ||
|
|
||
| Therefore, catching a C++ exception of type **Error** prevents a JavaScript |
There was a problem hiding this comment.
When C++ exceptions are enabled try/catch can be used to catch exceptions thrown from calls to JavaScript and then they can either be handled or rethrown before returning from a native method.
| Napi::Function jsFunctionThatThrows = someObj.As<Napi::Function>(); | ||
| Napi::Value result = jsFunctionThatThrows({ arg1, arg2 }); | ||
| if (result.IsEmpty()) return; | ||
| ``` |
There was a problem hiding this comment.
I think it would be better to suggest that they should check using IsExceptionPending as that will work for methods that don't return a value as well.
| ```cpp | ||
| Napi::Function jsFunctionThatThrows = someObj.As<Napi::Function>(); | ||
| Napi::Value result = jsFunctionThatThrows({ arg1, arg2 }); | ||
| if (result.IsEmpty()) { |
There was a problem hiding this comment.
Same goes here to check with IsExceptionPending
|
Overall looking good, just a few comments and suggestions. |
|
Completed fix proposed on first review |
|
@NickNaso I'm having trouble landing. Can you squash the commits and then I'll try again. |
First step of error documentation Documentation for error handling Complete fix proposed on first review
|
@mhdawson Could you try to land now? |
|
Closing in favour of #272 |
First step on writing documentation for error handling.