Last frame?
bearophile
bearophileHUGS at lycos.com
Sun Jun 26 05:53:28 PDT 2011
I have recently closed this bug report about File error messages:
http://d.puremagic.com/issues/show_bug.cgi?id=4911
Because now this program gives a better error message:
import std.stdio: File;
void foo() {
auto f = File("test.raw", "r");
f.write("hello");
}
void bar() {
foo();
}
void main() {
bar();
}
With DMD 2.053 it gives at runtime (using -g):
std.exception.ErrnoException at std\stdio.d(286): Cannot open file `test.raw' in
mode `r' (No such file or directory)
----------------
...\test.d(8): void test.bar()
...\test.d(10): _Dmain
----------------
The error is generated by this part of the File struct:
this(string name, in char[] stdioOpenmode = "rb")
{
p = new Impl(errnoEnforce(.fopen(name, stdioOpenmode),
text("Cannot open file `", name, "' in mode `",
stdioOpenmode, "'")),
1, name);
}
But the stack trace stops at the function before the one that has generated the error. I don't know enough about the implementation of the exceptions, but is it possible to invent a Phobos function that returns the name of the penultimate function? To be used like this:
this(string name, in char[] stdioOpenmode = "rb")
{
p = new Impl(errnoEnforce(.fopen(name, stdioOpenmode),
text("File usage in function `", lastFunctionName(),
"', cannot open file `", name, "' in mode `",
stdioOpenmode, "'")),
1, name);
}
That prints something like:
std.exception.ErrnoException at std\stdio.d(286): File usage in function `test.foo', cannot open file `test.raw' in mode `r' (No such file or directory)
Bye,
bearophile
More information about the Digitalmars-d-learn
mailing list