Subclass of Exception

Paul via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Jun 14 05:35:55 PDT 2014


On Saturday, 14 June 2014 at 12:17:46 UTC, FreeSlave wrote:
> On Saturday, 14 June 2014 at 11:59:53 UTC, Paul wrote:
>> One stupid question: in Python subclassing of Exception looks 
>> like:
>>  class MyError(Exception): pass
>> but in D, if I'm right, we should write more code:
>>  class MyError : Exception {
>>    this(string msg) { super(msg); }
>>  }
>> (without constructor we get error: "...Cannot implicitly 
>> generate a default ctor when base class <BASECLASS> is missing 
>> a default ctor...")
>>
>> Is any shorter D way?
>
> In this regard D is same as C++. When you create derived class, 
> you need to define constructors, even if all they do is passing 
> arguments to base class' constructor. It's really annoying, 
> especially when base class has many constructors.
> But in D you can apply some template magic to automate this 
> process for exceptions.
> Example:
>
> import std.stdio;
>
> template TemplateException(T)
> {
>     class TemplateException : Exception
>     {
>     public:
>         this(string msg, string file = __FILE__, size_t line = 
> __LINE__, Throwable next = null) {
>             super(msg, file, line, next);
>         }
>     }
> }
>
> void throwException(Exception ex)
> {
>     try {
>         throw ex;
>     }
>     catch(TemplateException!int e) {
>         writeln("int");
>     }
>     catch(TemplateException!double e) {
>         writeln("double");
>     }
>     catch(TemplateException!string e) {
>         writeln("string");
>     }
> }
>
> int main()
> {
>     auto intEx = new TemplateException!int("int error");
>     auto doubleEx = new TemplateException!double("double 
> error");
>     auto stringEx = new TemplateException!string("string 
> error");
>
>     throwException(intEx);
>     throwException(doubleEx);
>     throwException(stringEx);
>     return 0;
> }
>
> You also can tempalte with string literals instead of types to 
> gain more flexibility and use alias statement to provide 
> convenient names.

Thank you!!


More information about the Digitalmars-d-learn mailing list