How does exception work? I am inside a function that calls a constructor. Inside the constructor, an exception is thrown. However even though I have wrapped the body of the function inside a try/catch block, the program crashes from inside that constructor. Shouldn't the catch block in the function catch the exception?

Picture should clear it up a little bit:
https://i.imgur.com/3zinoZq.png

   // ui.d
103 deviceCombo.addOnChanged(delegate void(ComboBoxText _) {
   104              try {
105 device = new Device(deviceCombo.getActiveText()); // <-- call sight 106 auto status = sanityCheck(device, fcb.getFilename);
   107                  if (status.pass)
108 triggerHboxRevealer.setRevealChild(true);
   109                  else {
110 deviceCombo.setTooltipText(status.reason); 111 triggerHboxRevealer.setRevealChild(false);
   112                  }
   113              }
   114              catch (Exception e) {
115 deviceCombo.setTooltipText("Cannot read device");
   116                  triggerHboxRevealer.setRevealChild(false);
   117              }
   118          });


    // backend.d
    34      this(in string lsblkLine) {
    35          auto lineSplit = lsblkLine.split(" ");
    36          name = lineSplit.front();
    37          sizePretty = lineSplit.back();
38 foreach (str; lineSplit.dropOne().dropBackOne()) // <-- throws exception
    39              model ~= str ~ " ";
40 summary = format("%s\t%s\t%s", name, model, sizePretty);
    41      }

// error message
core.exception.AssertError@/usr/include/dlang/dmd/std/range/primitives.d(2340): 
Assertion failure
----------------
??:? _d_assertp [0x4e81ee29]
/usr/include/dlang/dmd/std/range/primitives.d:2340 pure nothrow @nogc @safe void std.range.primitives.popBack!(immutable(char)[]).popBack(ref immutable(char)[][]) [0x4e5e417e] /usr/include/dlang/dmd/std/range/package.d:3190 pure nothrow @nogc @safe immutable(char)[][] std.range.dropBackOne!(immutable(char)[][]).dropBackOne(immutable(char)[][]) [0x4e5e41d4] source/backend.d:38 backend.Device backend.Device.__ctor(const(immutable(char)[])) [0x4e5e8e6d] source/ui.d:105 void ui.PrimaryWindow.__ctor(gtk.Application.Application).__dgliteral4(gtk.ComboBoxText.ComboBoxText) [0x4e5ea17f]
../../../../.dub/packages/gtk-d-3.8.3/gtk-d/generated/gtkd/gobject/DClosure.d:135
 extern (C) void gobject.DClosure.DClosure.d_closure_marshal!(void 
delegate(gtk.ComboBoxText.ComboBoxText)).d_closure_marshal(gobject.c.types.GClosure*,
 gobject.c.types.GValue*, uint, gobject.c.types.GValue*, void*, void*) 
[0x4e7bf095]
??:? g_closure_invoke [0x4f9573d4]
Program exited with code 1

Reply via email to