collectException range violation

monarch_dodra monarchdodra at gmail.com
Tue Feb 19 23:54:18 PST 2013


On Wednesday, 20 February 2013 at 01:32:10 UTC, cal wrote:
> On Wednesday, 20 February 2013 at 01:19:54 UTC, Ali Çehreli 
> wrote:
>> The example is wrong. a[4] throws an Error (not Exception) but 
>> collectException catches Exception by default.
>>
>> Additionally, the example is doing something that is 
>> recommended against: Catching Error or a descendent of it.
>>
>> Still, it can be told to catch by Error:
>>
>>    assert(collectException!Error(a[4], b));
>>
>> Ali
>
> Ah right I didn't realize it could be made to collect an Error. 
> Thanks!

Note that an Error is not an Exception, and an Exception is not 
an Error. Both, however, are Throwable's. If you want to catch an 
*anything*, then catch a Throwable.

As already mentioned though, catching an Error is not something 
you usually do, as their existence implies an already 
catastrophic state. At best, they can be used to semi-gracefully 
die. Ergo, catching a Throwable is an even worst idea than 
catching an exception, as both shouldn't be treated the same way. 
EG:

import std.stdio;
import std.c.stdlib;

void foo(){???}

void main()
{
     try{
         foo();
     }
     catch(Exception e)
     {
         stderr.writeln("an exception was thrown. No biggy.");
         //Do nothing about it.
     }
     catch(Error e)
     {
         stderr.writen("A catastrophic error occurred. The program 
must close.");
         exit();
     }

     //Continue code here.
}


More information about the Digitalmars-d-learn mailing list