![]() |
Like in any other asynchronous invocation scheme it is important to be able to handle error conditions occurring while the asynchronous (and possibly remote) operation is executed. In HPX all error handling is based on standard C++ exception handling. Any exception thrown during the execution of an asynchronous operation will be transferred back to the original invocation locality, where it is rethrown during synchronization with the calling thread.
![]() |
Important |
---|---|
Exceptions thrown during asynchronous execution can be transferred back
to the invoking thread only for the synchronous and the asynchronous
case with synchronization. Like with any other unhandled exception, any
exception thrown during the execution of an asynchronous action without
synchronization will result in calling |
![]() |
Note |
---|---|
Even if error handling internally relies on exceptions, most of the API functions exposed by HPX can be used without throwing an exception. Please see Error Handling for more information. |
As an example, we will assume that the following remote function will be executed:
namespace app { void some_function_with_error(int arg) { if (arg < 0) {HPX_THROW_EXCEPTION
(bad_argument, "some_function_with_error", "some really bad error happened"); } // do something else... } } // This will define the action type 'some_error_action' which represents // the function 'app::some_function_with_error'.HPX_PLAIN_ACTION
(app::some_function_with_error, some_error_action);
The use of HPX_THROW_EXCEPTION
to report the error encapsulates the creation of a hpx::exception
which is initialized
with the error code hpx::bad_parameter
.
Additionally it carries the passed strings, the information about the file
name, line number, and call stack of the point the exception was thrown
from.
We invoke this action using the synchronous syntax as described before:
// note: wrapped function will throw hpx::exception
some_error_action act; // define an instance of some_error_action
try {
act(hpx::find_here(), -3); // exception will be rethrown from here
}
catch (hpx::exception
const& e) {
// prints: 'some really bad error happened: HPX(bad parameter)'
cout << e.what();
}
If this action is invoked asynchronously with synchronization, the exception
is propagated to the waiting thread as well and is re-thrown from the future's
function get()
:
// note: wrapped function will throw hpx::exception
some_error_action act; // define an instance of some_error_action
hpx::future<void> f = hpx::async(act, hpx::find_here(), -3);
try {
f.get(); // exception will be rethrown from here
}
catch (hpx::exception
const& e) {
// prints: 'some really bad error happened: HPX(bad parameter)'
cout << e.what();
}
For more information about error handling please refer to the section Error Handling. There we also explain how to handle error conditions without having to rely on exception.