On 2013-11-22 02:07:36 +0000, growler said:
On Friday, 22 November 2013 at 01:49:11 UTC, Shammah Chancellor wrote:
On 2013-11-18 06:32:46 +0000, Andrei Alexandrescu said:
1. Fix scope(failure) and then use it.
Andrei
Huh? Scope failure has no purpose here. It does not CATCH the
exception and prevent it from bubbling up the call chain. Try/catch
does do this.
-Shammah
It does if you return from the scope(failure) block. The problem is you
cannot mark the function as "nothrow"
For example:
---
void throwingFunction() {
throw new Exception("damn!");
}
void someFunc() // nothrow
{
scope(failure) {
writeln("Failed in someFunc()");
return;
}
throwingFunction();
}
void main() {
try {
someFunc();
writeln("Yay, someFunc() is nothrow");
} catch(Exception e) {
writeln("An exception in main!");
}
}
Output:
Failed in someFunc()
Yay, someFunc() is nothrow.
---
But you cannot mark someFunc() as nothrow.
What!? That shouldn't even be legal code! See below for why:
void throwingFunction() {
throw new Exception("damn!");
}
void someFunc() // nothrow
{
scope(failure) { writeln("What?");} <-- NEVER EXECUTED?!
scope(failure) {
writeln("Failed in someFunc()");
return;
}
throwingFunction();
}
void main() {
try {
someFunc();
writeln("Yay, someFunc() is nothrow");
} catch(Exception e) {
writeln("An exception in main!");
}
}