An incomplete idea regarding exceptions and @nogc that I have is to encapsulate the exception within the returned value. And whenever the original value is attempted to be read, a check for the exception is done. In other words, the exception is not thrown from the place where it is constructed, but from the place where the return value is accessed.

This provides two advantages. Firstly, a choice can be made by the user of the function on whether to throw or not. If the user decided to check for the existence of an exception prior to accessing the value, the exception (with all of its data, msg, file/line info) can be accessed without (the costly) throwing. And if the user did not check for the exception, whenever the returned value is attempted to be accessed, throwing will occur (this gets us ease of use and flexibility).

Secondly, the returned type can contain the exception. This will remove the need for the GC and the need for allocating the exception on the heap.

Some preliminary code demonstrating the idea:
http://dpaste.dzfl.pl/3d37d524e4c6

The code currently is not @nogc, because emplace is not.

A disadvantage to this is that it cannot be used with functions that have purposes other than returning a value. For example, writing to a file.

Reply via email to