www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Why writeln can't be converted to nothrow with just catching of

reply partypooper <pythonproof gmail.com> writes:
Do I completely not understand what is `nothrow` or why I can't 
make function nothrow with just catching StdioException?

This doesn't work
```d
nothrow void hello() {
   try {
     writeln("Hello, World!")
   } catch (StdioException) {}
}
```
This doest work
```d
nothrow void hello() {
   try {
     writeln("Hello, World!")
   } catch (Exception) {}
}
```
Feb 21 2022
next sibling parent reply Basile B. <b2.temp gmx.com> writes:
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
 ```d
 nothrow void hello() {
   try {
     writeln("Hello, World!")
   } catch (StdioException) {}
 }
 ```
 This doest work
 ```d
 nothrow void hello() {
   try {
     writeln("Hello, World!")
   } catch (Exception) {}
 }
 ```
I believe it's because it can throw ConvException as well ;)
Feb 21 2022
next sibling parent reply Basile B. <b2.temp gmx.com> writes:
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
 ```d
 nothrow void hello() {
   try {
     writeln("Hello, World!")
   } catch (StdioException) {}
 }
 ```
 This doest work
 ```d
 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 ;)
Feb 21 2022
parent bauss <jj_1337 live.dk> writes:
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
 ```d
 nothrow void hello() {
   try {
     writeln("Hello, World!")
   } catch (StdioException) {}
 }
 ```
 This doest work
 ```d
 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: ```d __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.
Feb 21 2022
prev sibling parent reply Basile B. <b2.temp gmx.com> writes:
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
 ```d
 nothrow void hello() {
   try {
     writeln("Hello, World!")
   } catch (StdioException) {}
 }
 ```
 This doest work
 ```d
 nothrow void hello() {
   try {
     writeln("Hello, World!")
   } catch (Exception) {}
 }
 ```
I believe it's because it can throw ConvException as well ;)
more likely UTFException actually
Feb 21 2022
parent reply partypooper <pythonproof gmail.com> writes:
On Monday, 21 February 2022 at 10:58:26 UTC, Basile B. wrote:
 more likely UTFException actually
Additionaly catching UTF and Conv exceptions doesn't help.
Feb 21 2022
parent reply Basile B. <b2.temp gmx.com> writes:
On Monday, 21 February 2022 at 11:05:42 UTC, partypooper wrote:
 On Monday, 21 February 2022 at 10:58:26 UTC, Basile B. wrote:
 more likely UTFException actually
Additionaly catching UTF and Conv exceptions doesn't help.
Yeah there must be another one then. Something actionnable is the documentation.
Feb 21 2022
next sibling parent reply partypooper <pythonproof gmail.com> writes:
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?
Feb 21 2022
parent Basile B. <b2.temp gmx.com> writes:
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"
Feb 21 2022
prev sibling parent reply Mike Parker <aldacron gmail.com> writes:
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`. ```D 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 ```
Feb 21 2022
parent partypooper <pythonproof gmail.com> writes:
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`. ```D 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.
Feb 21 2022
prev sibling next sibling parent Basile B. <b2.temp gmx.com> writes:
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
 ```d
 nothrow void hello() {
   try {
     writeln("Hello, World!")
   } catch (StdioException) {}
 }
 ```
 This doest work
 ```d
 nothrow void hello() {
   try {
     writeln("Hello, World!")
   } catch (Exception) {}
 }
 ```
https://issues.dlang.org/show_bug.cgi?id=22800
Feb 21 2022
prev sibling parent reply Mike Parker <aldacron gmail.com> writes:
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?
D does not have checked exceptions like Java, so the compiler doesn't have anyway to verify that any function you call won't throw a given exception. You have to catch `Exception` to satisfy the `nothrow` requirement.
Feb 21 2022
parent reply partypooper <pythonproof gmail.com> writes:
On Monday, 21 February 2022 at 11:04:46 UTC, Mike Parker 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?
D does not have checked exceptions like Java, so the compiler doesn't have anyway to verify that any function you call won't throw a given exception. You have to catch `Exception` to satisfy the `nothrow` requirement.
Oh, that's explain it. So with such behavior there is no reason at all to make make function nothrow, if it uses throw functions in its body? And as much as I already know compliler can deduce and automatically adds nothrow to all functions which do not throw exceptions. Right?
Feb 21 2022
parent Mike Parker <aldacron gmail.com> writes:
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.
Feb 21 2022