February 21, 2022

On Monday, 21 February 2022 at 11:11:28 UTC, partypooper wrote:

>

So with such behavior there is no reason at all to make make function nothrow, if it uses throw functions in its body?

I'm not sure what you mean. If a function throws an exception, it can't be nothrow.

>

And as much as I already know compliler can deduce and automatically adds nothrow to all functions which do not throw exceptions. Right?

Function attribute inference is done in specific circumstances, but not for all functions. See https://dlang.org/spec/function.html#function-attribute-inference.

February 21, 2022

On Monday, 21 February 2022 at 11:07:55 UTC, Basile B. wrote:

>

Yeah there must be another one then. Something actionnable is the documentation.

This has nothing to do with which exceptions types a function throws. The compiler doesn't dig into that. You have to catch Exception.

import std.stdio;

class MyException : Exception {
    this(string msg) { super(msg); }
}

void throwing(int x) {
    if(x > 2) throw new MyException("Derp!");
    else writeln(x);
}

void noThrowing() nothrow {
    try {
        throwing(10);
    }
    catch(MyException me) {}
}

void main()
{
    noThrowing();
}
onlineapp.d(14): Error: function `onlineapp.throwing` is not `nothrow`
onlineapp.d(12): Error: `nothrow` function `onlineapp.noThrowing` may throw
February 21, 2022

On Monday, 21 February 2022 at 11:12:38 UTC, partypooper wrote:

>

On Monday, 21 February 2022 at 11:07:55 UTC, Basile B. wrote:

>

Yeah there must be another one then. Something actionnable is the documentation.

What about Mike Parker answer?

if nothrow fails that's because things are checked. We could imagine a second flow analysis leading to better error messages. You see, instead of the generic error message you get now.

"If it fails, let's see why"

February 21, 2022

On Monday, 21 February 2022 at 11:21:52 UTC, Mike Parker wrote:

>

On Monday, 21 February 2022 at 11:07:55 UTC, Basile B. wrote:

>

[...]

This has nothing to do with which exceptions types a function throws. The compiler doesn't dig into that. You have to catch Exception.

import std.stdio;

class MyException : Exception {
    this(string msg) { super(msg); }
}

void throwing(int x) {
    if(x > 2) throw new MyException("Derp!");
    else writeln(x);
}

void noThrowing() nothrow {
    try {
        throwing(10);
    }
    catch(MyException me) {}
}

void main()
{
    noThrowing();
}
onlineapp.d(14): Error: function `onlineapp.throwing` is not `nothrow`
onlineapp.d(12): Error: `nothrow` function `onlineapp.noThrowing` may throw

Thank You for detailed explanation.

February 21, 2022

On Monday, 21 February 2022 at 10:57:07 UTC, Basile B. wrote:

>

On Monday, 21 February 2022 at 10:53:56 UTC, Basile B. wrote:

>

On Monday, 21 February 2022 at 10:49:13 UTC, partypooper wrote:

>

Do I completely not understand what is nothrow or why I can't make function nothrow with just catching StdioException?

This doesn't work

nothrow void hello() {
  try {
    writeln("Hello, World!")
  } catch (StdioException) {}
}

This doest work

nothrow void hello() {
  try {
    writeln("Hello, World!")
  } catch (Exception) {}
}

I believe it's because it can throw ConvException as well ;)

However you're totally right to open a discussion, the documentation is innacurate:

in https://dlang.org/phobos/std_stdio.html#.writeln

just StdioException is mentioned ;)

What if we could do ex. this:

__traits(possibleExceptions, writeln);

Which would give all exceptions a function could possibly throw.

That way we could build our try/catch based on that.

For nothrow it should return nothing of course, for extern functions that have no source code available it should only return "Exception" of course.

Just a thought I just had.

1 2
Next ›   Last »