problem with exceptions

Dmitri via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Oct 2 06:15:42 PDT 2015


On Friday, 2 October 2015 at 12:45:38 UTC, steven kladitis wrote:
> On Friday, 2 October 2015 at 12:18:36 UTC, Dmitri wrote:
>> On Friday, 2 October 2015 at 11:44:21 UTC, steven kladitis 
>> wrote:
>>> C:\d\examples>pb2
>>> =>main's first line
>>>   =>makeOmelet's first line
>>>     =>prepareAll's first line
>>>       =>prepareEggs's first line
>>> object.Exception at pb2.d(64): Cannot take -8 eggs from the 
>>> fridge
>>> ----------------
>>> 0x00402252
>>> 0x0040512F
>>> 0x00405043
>>> 0x00403E48
>>> 0x7600338A in BaseThreadInitThunk
>>> 0x77A497F2 in RtlInitializeExceptionChain
>>> 0x77A497C5 in RtlInitializeExceptionChain
>>>
>>>
>>> ----- I always see the info at the bottom. Is this normal. I 
>>> was thinkig I should only the the exception message itself.
>>> ---  this is windows 7 32 bit.
>>
>> that would the stack of the thread leading up to the 
>> exception. I think you get that if you dump the exception 
>> object itself (not just the message).
>
> -------------- code is below
> import std.stdio;
> import std.string;
>
> void indent(in int level)
> {
>     foreach (i; 0 .. level * 2)
>     {
>         write(' ');
>     }
> }
> void entering(in char[] functionName, in int level)
> {
>     indent(level);
>     writeln("=>", functionName, "'s first line");
> }
> void exiting(in char[] functionName, in int level)
> {
>     indent(level);
>     writeln("<=", functionName, "'s last line");
> }
> void main()
> {
>     entering("main", 0);
>     makeOmelet(-8);
>     eatOmelet();
>     exiting("main", 0);
> }
> void makeOmelet(int eggCount)
> {
>     entering("makeOmelet", 1);
>     prepareAll(eggCount);
>     cookEggs();
>     cleanAll();
>     exiting("makeOmelet", 1);
> }
> void eatOmelet()
> {
>     entering("eatOmelet", 1);
>     exiting("eatOmelet", 1);
> }
> void prepareAll(int eggCount)
> {
>     entering("prepareAll", 2);
>     prepareEggs(eggCount);
>     prepareButter();
>     preparePan();
>     exiting("prepareAll", 2);
> }
> void cookEggs()
> {
>     entering("cookEggs", 2);
>     exiting("cookEggs", 2);
> }
> void cleanAll()
> {
>     entering("cleanAll", 2);
>     exiting("cleanAll", 2);
> }
> void prepareEggs(int count)
> {
>     entering("prepareEggs", 3);
>     if (count < 1)
>     {
>         throw new Exception(
>                   format("Cannot take %s eggs from the fridge", 
> count));
>     }
>     exiting("prepareEggs", 3);
> }
> void prepareButter()
> {
>     entering("prepareButter", 3);
>     exiting("prepareButter", 3);
> }
> void preparePan()
> {
>     entering("preparePan", 3);
>     exiting("preparePan", 3);
> }

I guess it's normal:
void main()
{
	throw new Exception("duh");
}

-->
object.Exception@/home/d955/f505.d(3): duh
---------------- 
./f505(_D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv+0x1f) [0x41e467] ./f505(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate())+0x2a) [0x41e3c2] ./f505(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll()+0x2b) [0x41e423] ./f505(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate())+0x2a) [0x41e3c2] ./f505(_d_run_main+0x1d2) [0x41e342] ./f505(main+0x12) [0x41d9ce] /usr/lib/libc.so.6(__libc_start_main+0xf5) [0x40967a15]


Looks like the runtime always dumps the uncaught exception that 
way. If you need it any other way, catch by Exception and print 
only the message.


More information about the Digitalmars-d-learn mailing list