Throwing exception in constructor
Stijn Herreman
stijn.herreman at telenet.be
Tue Aug 16 10:36:03 PDT 2011
On 16/08/2011 19:24, Vijay Nayar wrote:
> On Tue, 16 Aug 2011 19:08:53 +0200, Stijn Herreman wrote:
>
>> Why is the return statement required, while nothing after the Exception
>> is executed?
>> Error: one path skips constructor
>>
>> public this(string p1, string p2, string p3) {
>> string json = download_string(...);
>>
>> if (json is null)
>> {
>> throw new Exception("404");
>> writeln("test");
>> return;
>> }
>> else
>> {
>> this(json);
>> }
>> }
>>
>> package this(string json)
>> {
>> ...
>> }
>
> What compiler are you using? Using DMD2 (DMD32 D Compiler v2.054), I
> have no problem with the example below. I suspect the problem may not
> have anything to do with return statements.
>
> import std.stdio;
> import std.conv;
>
> class Hambo {
> public int _value;
>
> public this(string value) {
> this(to!int(value));
> }
>
> public this(int value) {
> if (value< 10) {
> throw new Exception("Not high enough.");
> } else {
> _value = value;
> }
> }
> }
>
> void main() {
> // Throws: object.Exception at constructor.d(13): Not high enough.
> //Hambo ham1 = new Hambo("4");
> Hambo ham2 = new Hambo("14");
> writeln(ham2._value);
> }
It happens only when chaining constructors.
Doesn't compile:
class Hambo {
public int _value;
public this(string value) {
if (value == "") {
throw new Exception("Empty.");
} else {
this(to!int(value));
}
}
public this(int value) {
if (value < 10) {
throw new Exception("Not high enough.");
} else {
_value = value;
}
}
}
Compiles:
class Hambo {
public int _value;
public this(string value) {
if (value == "") {
throw new Exception("Empty.");
return;
} else {
this(to!int(value));
}
}
public this(int value) {
if (value < 10) {
throw new Exception("Not high enough.");
} else {
_value = value;
}
}
}
Compiles:
class Hambo {
public int _value;
public this(string value) {
if (value == "") {
throw new Exception("Empty.");
}
}
public this(int value) {
if (value < 10) {
throw new Exception("Not high enough.");
} else {
_value = value;
}
}
}
More information about the Digitalmars-d-learn
mailing list