[Python-Dev] Exception compatibility with aliens

13 views
Skip to first unread message

Frederick Virchanza Gotham

unread,
Jan 18, 2023, 12:34:50 PM1/18/23
to std-proposals, pytho...@python.org
I have sent this email to two mailing lists for programming language
proposals, the one for C++ and the one for Python. If you reply to
this email, please make sure you reply to both. You can see the
mailing list archives for this month for each list here:

C++ : https://lists.isocpp.org/std-proposals/2023/01/date.php
Python : https://mail.python.org/archives/list/pytho...@python.org/2023/1/

Both C++ and Python have exception handling, however a C++ program
which links with a Python library is unable to handle an exception
thrown from Python.

Is it conceivable in the future that the C++ Standards Committee and
the Python Steering Council could cooperate and furnish each other
with an exhaustive list of exceptions thrown from their respective
standard libraries, so that both languages can implement compatibility
with each other's exceptions?

If such a list were to accompany each C++ standard and each Python
Language Reference, then for example the C++ standard library could
provide classes for handling Python exceptions:

namespace std {

struct alien_exception /* does not inherit from std::exception */ {
enum class language : unsigned int { java=1u, csharp, python };
virtual language lang(void) const noexcept = 0;
virtual char const *what(void) const noexcept = 0;
};

namespace aliens {

namespace java {
struct exception : alien_exception {
char const *getLocalizedMessage(void) const noexcept;
char const *getMessage(void) const noexcept;
std::stacktrace getStackTrace(void) const noexcept;
char const *what(void) const noexcept override { return
this->getMessage(); }
language lang(void) const noexcept override { return language::java; }
};
}

namespace python {
struct exception : alien_exception {
char const *const *notes(void) const noexcept; /* null terminated */
std::stacktrace traceback() const noexcept;
char const *what(void) const noexcept override { return
this->notes()[0u]; }
language lang(void) const noexcept override { return language::python; }
};
}

namespace python {
struct BaseException : exception {};
struct BaseExceptionGroup : BaseException {};
struct GeneratorExit : BaseException {};
struct KeyboardInterrupt : BaseException {};
struct SystemExit : BaseException {};
struct Exception : BaseException {};
struct ArithmeticError : Exception {};
struct FloatingPointError : ArithmeticError {};
struct OverflowError : ArithmeticError {};
struct ZeroDivisionError : ArithmeticError {};
struct AssertionError : Exception {};
struct AttributeError : Exception {};
struct BufferError : Exception {};
struct EOFError : Exception {};
struct ExceptionGroupBaseExceptionGroup : Exception {};
struct ImportError : Exception {};
struct ModuleNotFoundError : ImportError {};
struct LookupError : Exception {};
struct IndexError : LookupError {};
struct KeyError : LookupError {};
struct MemoryError : Exception {};
struct NameError : Exception {};
struct UnboundLocalError : NameError {};
struct OSError : Exception {};
struct BlockingIOError : OSError {};
struct ChildProcessError : OSError {};
struct ConnectionError : OSError {};
struct BrokenPipeError : ConnectionError {};
struct ConnectionAbortedError : ConnectionError {};
struct ConnectionRefusedError : ConnectionError {};
struct ConnectionResetError : ConnectionError {};
struct FileExistsError : OSError {};
struct FileNotFoundError : OSError {};
struct InterruptedError : OSError {};
struct IsADirectoryError : OSError {};
struct NotADirectoryError : OSError {};
struct PermissionError : OSError {};
struct ProcessLookupError : OSError {};
struct TimeoutError : OSError {};
struct ReferenceError : Exception {};
struct RuntimeError : Exception {};
struct NotImplementedError : RuntimeError {};
struct RecursionError : RuntimeError {};
struct StopAsyncIteration : Exception {};
struct StopIteration : Exception {};
struct SyntaxError : Exception {};
struct IndentationError : SyntaxError {};
struct TabError : IndentationError {};
struct SystemError : Exception {};
struct TypeError : Exception {};
struct ValueError : Exception {};
struct UnicodeError : ValueError {};
struct UnicodeDecodeError : UnicodeError {};
struct UnicodeEncodeError : UnicodeError {};
struct UnicodeTranslateError : UnicodeError {};
struct Warning : Exception {};
struct BytesWarning : Warning {};
struct DeprecationWarning : Warning {};
struct EncodingWarning : Warning {};
struct FutureWarning : Warning {};
struct ImportWarning : Warning {};
struct PendingDeprecationWarning : Warning {};
struct ResourceWarning : Warning {};
struct RuntimeWarning : Warning {};
struct SyntaxWarning : Warning {};
struct UnicodeWarning : Warning {};
struct UserWarning : Warning {};
} // close namespace 'python'
} // close namespace 'aliens'

class forced_stack_unwind {};

} // close namespace 'std'

extern int Some_Func_In_Python_Library(void)
{
return 7;
/* or throws an exception */
}

int main(void)
{
try { Some_Func_In_Python_Library(); }
catch ( std::aliens::python::FloatingPointError const & )
{
// The specific Python exception we want to handle
}
catch ( std::aliens::python::exception const & )
{
// Any exception thrown from Python
}
catch ( std::alien_exception const &)
{
// Maybe the Python library linked with an
// Eiffel library that threw an exception
}
catch ( std::forced_stack_unwind )
{

}
}
_______________________________________________
Python-Dev mailing list -- pytho...@python.org
To unsubscribe send an email to python-d...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at https://mail.python.org/archives/list/pytho...@python.org/message/CYAIPU2R4A2HMAEDX6XDMWJ3FZDS6JOL/
Code of Conduct: http://python.org/psf/codeofconduct/

Ville Voutilainen

unread,
Jan 18, 2023, 12:35:18 PM1/18/23
to std-pr...@lists.isocpp.org, pytho...@python.org, Frederick Virchanza Gotham
On Wed, 18 Jan 2023 at 11:45, Frederick Virchanza Gotham via
Std-Proposals <std-pr...@lists.isocpp.org> wrote:
>
> I have sent this email to two mailing lists for programming language
> proposals, the one for C++ and the one for Python. If you reply to
> this email, please make sure you reply to both. You can see the
> mailing list archives for this month for each list here:
>
> C++ : https://lists.isocpp.org/std-proposals/2023/01/date.php
> Python : https://mail.python.org/archives/list/pytho...@python.org/2023/1/
>
> Both C++ and Python have exception handling, however a C++ program
> which links with a Python library is unable to handle an exception
> thrown from Python.

Perhaps you should just use
https://www.boost.org/doc/libs/1_81_0/libs/python/doc/html/index.html

See also https://realpython.com/python-bindings-overview/

In both C++ and Python, exceptions can contain anything as their
payload. The problem becomes a problem of
mapping one language to the other, not just mapping exceptions. That
makes it a general cross-language binding generation problem,
so the forthcoming reflection/injection in C++ can certainly help, but
just having a 'list' of exceptions isn't going to
cut it either way.
_______________________________________________
Python-Dev mailing list -- pytho...@python.org
To unsubscribe send an email to python-d...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at https://mail.python.org/archives/list/pytho...@python.org/message/XWENS3AO6PYAHGQL6S64NDXUT45PMEYP/

Frederick Virchanza Gotham

unread,
Jan 18, 2023, 12:44:27 PM1/18/23
to std-pr...@lists.isocpp.org, pytho...@python.org
On Wed, Jan 18, 2023 at 3:07 PM Jason McKesson wrote:
>
> Also, this proposal seems to be missing the biggest issue with
> cross-language exception handling: the fact that you can't throw
> exceptions across languages. The only thing you *can* do is catch
> exceptions on the source language end, convert them into some data
> packet, and throw a different exception on the destination language
> side.


Yes this is what I had in mind. Behind the scenes, the C++ compiler
would catch the Python exception and then throw something that C++ can
deal with "such as std::aliens::python::exception".
_______________________________________________
Python-Dev mailing list -- pytho...@python.org
To unsubscribe send an email to python-d...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at https://mail.python.org/archives/list/pytho...@python.org/message/5OARJXOXYFXHTO2OBHUGFVFSQHOVPVPO/

Barry Scott

unread,
Jan 18, 2023, 5:07:03 PM1/18/23
to cauldwel...@gmail.com, std-pr...@lists.isocpp.org, pytho...@python.org

On 18 Jan 2023, at 15:35, Frederick Virchanza Gotham <cauldwel...@gmail.com> wrote:

On Wed, Jan 18, 2023 at 3:07 PM Jason McKesson wrote:

Also, this proposal seems to be missing the biggest issue with
cross-language exception handling: the fact that you can't throw
exceptions across languages. The only thing you *can* do is catch
exceptions on the source language end, convert them into some data
packet, and throw a different exception on the destination language
side.


Yes this is what I had in mind. Behind the scenes, the C++ compiler
would catch the Python exception and then throw something that C++ can
deal with "such as std::aliens::python::exception".

In PyCXX I allows exceptions to go into and out of python and C++.

You can raise in C++ go into python and back into C++ and the exception arrives as expected.
You can riase in Python fo into C++ and back to Python and again the exception arrives as expected.
 That is as long as its a python exception.

Barry

Josh Engroff

unread,
Jan 18, 2023, 7:01:31 PM1/18/23
to Barry Scott, cauldwel...@gmail.com, std-pr...@lists.isocpp.org, pytho...@python.org
Table this, perhaps? 


On Jan 18, 2023, at 5:04 PM, Barry Scott <ba...@barrys-emacs.org> wrote:



Antoine Pitrou

unread,
Jan 19, 2023, 11:44:12 AM1/19/23
to pytho...@python.org, std-pr...@lists.isocpp.org
On Wed, 18 Jan 2023 12:04:41 +0200
Ville Voutilainen via Std-Proposals <std-pr...@lists.isocpp.org>
wrote:
> On Wed, 18 Jan 2023 at 11:45, Frederick Virchanza Gotham via
> Std-Proposals <std-pr...@lists.isocpp.org> wrote:
> >
> > I have sent this email to two mailing lists for programming language
> > proposals, the one for C++ and the one for Python. If you reply to
> > this email, please make sure you reply to both. You can see the
> > mailing list archives for this month for each list here:
> >
> > C++ : https://lists.isocpp.org/std-proposals/2023/01/date.php
> > Python : https://mail.python.org/archives/list/pytho...@python.org/2023/1/
> >
> > Both C++ and Python have exception handling, however a C++ program
> > which links with a Python library is unable to handle an exception
> > thrown from Python.
>
> Perhaps you should just use
> https://www.boost.org/doc/libs/1_81_0/libs/python/doc/html/index.html

I would suggest taking a look at pybind11 for a potentially more modern
design (also, free of boost dependencies).
https://pybind11.readthedocs.io/en/latest/advanced/exceptions.html

Regards

Antoine.


_______________________________________________
Python-Dev mailing list -- pytho...@python.org
To unsubscribe send an email to python-d...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at https://mail.python.org/archives/list/pytho...@python.org/message/WGSJJBQA4DK2NK2LQCNLTQZIKML5XVX7/
Reply all
Reply to author
Forward
0 new messages