Re: catching Errors in OS callbacks how to print stack trace?
On Monday, 24 February 2020 at 13:43:30 UTC, Adam D. Ruppe wrote: On Monday, 24 February 2020 at 13:42:01 UTC, NaN wrote: try { writeln(e.msg); } try `writeln(e.toString());` instead. msg only contains the message passed to the constructor by itself, toString includes the file/line and stack trace members too. easiest way usually. That worked thanks!
Re: catching Errors in OS callbacks how to print stack trace?
On Monday, 24 February 2020 at 13:42:01 UTC, NaN wrote: try { writeln(e.msg); } try `writeln(e.toString());` instead. msg only contains the message passed to the constructor by itself, toString includes the file/line and stack trace members too. easiest way usually.
catching Errors in OS callbacks how to print stack trace?
Normally a failed assert gives the file, line number and a stack trace, but I hit one today that just prints.. assertion failure Im sure it is because it's in the WindowProc callback from the OS. As the callback is nothrow you need to catch and handle anything there, you have to catch all throwables or else it just hangs when you hit an assert. But how do I get it to print the full file, line, and stack trace? Here's my window proc... extern(Windows) LRESULT WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) nothrow { try { auto window = cast(Window) (cast(void*) GetWindowLongPtr(hwnd, 0)); if (window is null) return DefWindowProcA(hwnd, msg, wparam, lparam); else return window.windowProc(msg, wparam, lparam); } catch (Throwable e) { try { writeln(e.msg); } catch(Exception what) {} PostQuitMessage(0); return 0; } }
Re: Catching Errors
On Friday, 20 January 2017 at 14:22:23 UTC, Adam D. Ruppe wrote: On Friday, 20 January 2017 at 07:50:23 UTC, Jacob Carlborg wrote: That doesn't work well with a unit test framework that want to catch assertions to be able to continue with other tests. I'd suggest writing a new assert handler for your framework that does something different, then you can get a bit more control over it. Though, the built in assert is underpowered regardless... oh, how I wish it even had the convenience of C's assert, but I really want it to go a step further and show the values as well as the code that is failing. int a = 0; int b = 1; assert(a == b); Assertion `a == b` failed: test.d(3) a = 0 b = 1 Default asserts can do that (not sure since when as I just discovered that recently): int a=0; int b=1; assert(a==b, format("a=%d, b=%d", a, b)); core.exception.AssertError@/tmp/test.d(18): a = 0, b = 1 I know unit test frameworks tend to offer their own functions to get closer to this but it'd be compelling to me if it just worked with the built in too. Oh well, that's not today, but doing your own assert handler that just prints and continues, or prints and aborts the current test while continuing with the next or something like that is doable and perhaps useful.
Re: Catching Errors
On Thursday, 19 January 2017 at 16:55:18 UTC, Jack Stouffer wrote: Ok, very visible idiotic moment here: This is already the rule. Just got the same (glad) feeling when I was reporting about an apparently dangerous feature of RefCounted payload access being @safe. I started to write a test case and noticed that while payload IS @safe, creating and destroying a RefCounted is not. Nothing to worry about!
Re: Catching Errors
On Friday, 20 January 2017 at 17:00:12 UTC, Jacob Carlborg wrote: Unfortunately setting a new assert handler requires it to be nothrow [1]. WTF. I guess I see why, assert is assumed to be nothrow and used in those statically marked blocks, but ugh. AST macros :) Yeah, it could do it, but since assert is built in, the compiler can just do it for us too. but meh.
Re: Catching Errors
On 2017-01-20 15:22, Adam D. Ruppe wrote: I'd suggest writing a new assert handler for your framework that does something different, then you can get a bit more control over it. Unfortunately setting a new assert handler requires it to be nothrow [1]. I would most likely want it to be throw an exception instead of an error to bail out of the current test, but continue with the rest of the tests. Sure, it's possible to use a completely different than "assert", but that feels quite a shame when we have a built-in keyword for this purpose. Though, the built in assert is underpowered regardless... oh, how I wish it even had the convenience of C's assert, but I really want it to go a step further and show the values as well as the code that is failing. int a = 0; int b = 1; assert(a == b); Assertion `a == b` failed: test.d(3) a = 0 b = 1 AST macros :) [1] http://dlang.org/phobos/core_exception.html#.AssertHandler -- /Jacob Carlborg
Re: Catching Errors
On Friday, 20 January 2017 at 07:50:23 UTC, Jacob Carlborg wrote: That doesn't work well with a unit test framework that want to catch assertions to be able to continue with other tests. I'd suggest writing a new assert handler for your framework that does something different, then you can get a bit more control over it. Though, the built in assert is underpowered regardless... oh, how I wish it even had the convenience of C's assert, but I really want it to go a step further and show the values as well as the code that is failing. int a = 0; int b = 1; assert(a == b); Assertion `a == b` failed: test.d(3) a = 0 b = 1 I know unit test frameworks tend to offer their own functions to get closer to this but it'd be compelling to me if it just worked with the built in too. Oh well, that's not today, but doing your own assert handler that just prints and continues, or prints and aborts the current test while continuing with the next or something like that is doable and perhaps useful.
Re: Catching Errors
On 01/20/2017 07:47 AM, Jacob Carlborg wrote: > On 2017-01-19 16:46, Jack Stouffer wrote: > >> Or, you can mark that unit test block as @system and have @safe tests in >> another block. > > No, this is for when the framework is catching the exception. It needs > to wrap _all_ unit test blocks in a try-catch. If an assert fails I want > the rest of the unit tests to be able to run. And if one is to take language spec by heart, currently ANY framework that implements it relies on undefined behavior :( Usage of `assert` in unittests was quite a mistake. signature.asc Description: OpenPGP digital signature
Re: Catching Errors
On 2017-01-20 03:11, Adam D. Ruppe wrote: It is just that Errors are not necessarily *thrown*. The implementation is allowed to immediately abort on them too - your catch has no guarantee to actually run, whereas with Exceptions, they are. That doesn't work well with a unit test framework that want to catch assertions to be able to continue with other tests. -- /Jacob Carlborg
Re: Catching Errors
On 2017-01-19 17:22, Atila Neves wrote: Just slap @trusted on the part of the framework that catches them. Sure, but that doesn't help with the plan [1] making Errors unable to be caught even in system code. [1] Note sure if it's really the plan but it's been talked about -- /Jacob Carlborg
Re: Catching Errors
On 2017-01-19 16:46, Jack Stouffer wrote: Or, you can mark that unit test block as @system and have @safe tests in another block. No, this is for when the framework is catching the exception. It needs to wrap _all_ unit test blocks in a try-catch. If an assert fails I want the rest of the unit tests to be able to run. -- /Jacob Carlborg
Re: Catching Errors
On Friday, 20 January 2017 at 02:11:41 UTC, Adam D. Ruppe wrote: On Friday, 20 January 2017 at 01:24:18 UTC, Jon Degenhardt wrote: Is there a place in the docs that describe the difference between errors and exceptions? As to the particular example, why is it unsafe to recover from attempting to access memory past the end of the array, as long as the access was prevented? It is just that Errors are not necessarily *thrown*. The implementation is allowed to immediately abort on them too - your catch has no guarantee to actually run, whereas with Exceptions, they are. Thanks, that's helpful. I hadn't seen it before, but the documentation for Object.Error and Object.Exception is clear on the distinction (https://dlang.org/phobos/object.html#.Error). There the intent is clear that Object.Error is for "unrecoverable runtime errors", and "not safe to catch and handle". An aside - The documentation I had read, in the Error Handling chapter of the Language Reference, https://dlang.org/spec/errors.html, is less crisp about this distinction than the documentation for Object.Error. Perhaps an opportunity to improve this part of the documentation. --Jon
Re: Catching Errors
On Friday, 20 January 2017 at 01:24:18 UTC, Jon Degenhardt wrote: Is there a place in the docs that describe the difference between errors and exceptions? As to the particular example, why is it unsafe to recover from attempting to access memory past the end of the array, as long as the access was prevented? It is just that Errors are not necessarily *thrown*. The implementation is allowed to immediately abort on them too - your catch has no guarantee to actually run, whereas with Exceptions, they are.
Re: Catching Errors
On Fri, 20 Jan 2017 01:24:18 +, Jon Degenhardt wrote: > As > to the particular example, why is it unsafe to recover from attempting > to access memory past the end of the array, as long as the access was > prevented? Because array bounds checking seems to be intended as an aid to find bugs, a tool that you use during testing and development and turn off for production. Disabling array bounds checks is too dangerous for me.
Re: Catching Errors
On Thu, 19 Jan 2017 14:29:46 +, Jack Stouffer wrote: > From what I understand, the difference between an Exception and and > Error is that Errors signal your program has entered into an invalid > state. That's the intent, but I don't think that matches reality. > For example, going past the end of an array and attempting to > access that memory. The program is in a well-defined state. In production, I want to catch and log that problem, move that work item into the dead letter queue, and move on. There are other problems that lead to the program being in an unpredictable, possibly unusable state. This is primarily when the runtime produces an Error regarding its internal state (as opposed to parameter validation).
Re: Catching Errors
On Friday, 20 January 2017 at 01:24:18 UTC, Jon Degenhardt wrote: On Thursday, 19 January 2017 at 14:29:46 UTC, Jack Stouffer wrote: [...] I think this is an area of D I haven't explored yet. Is there a place in the docs that describe the difference between errors and exceptions? As to the particular example, why is it unsafe to recover from attempting to access memory past the end of the array, as long as the access was prevented? --Jon It indicates a programming error. If you attempted to read past the end, what other invalid data did you end up actually succeeding reading?
Re: Catching Errors
On Thursday, 19 January 2017 at 14:29:46 UTC, Jack Stouffer wrote: From what I understand, the difference between an Exception and and Error is that Errors signal your program has entered into an invalid state. For example, going past the end of an array and attempting to access that memory. On the flip side, Exceptions signal that something out of the ordinary happened, but with proper handling the program can go on it's merry way. An example being entering 13 as a month in a std.datetime.Date. If this is the case, would it not make sense to make it illegal to catch Errors in @safe code? I think this is an area of D I haven't explored yet. Is there a place in the docs that describe the difference between errors and exceptions? As to the particular example, why is it unsafe to recover from attempting to access memory past the end of the array, as long as the access was prevented? --Jon
Re: Catching Errors
On Thursday, 19 January 2017 at 14:29:46 UTC, Jack Stouffer wrote: From what I understand, the difference between an Exception and and Error is that Errors signal your program has entered into an invalid state. For example, going past the end of an array and attempting to access that memory. On the flip side, Exceptions signal that something out of the ordinary happened, but with proper handling the program can go on it's merry way. An example being entering 13 as a month in a std.datetime.Date. If this is the case, would it not make sense to make it illegal to catch Errors in @safe code? Ok, very visible idiotic moment here: This is already the rule.
Re: Catching Errors
On Thursday, 19 January 2017 at 15:43:26 UTC, Jacob Carlborg wrote: On 2017-01-19 15:29, Jack Stouffer wrote: If this is the case, would it not make sense to make it illegal to catch Errors in @safe code? There's the issue with AssertError, which is useful for a unit test framework to catch. Perhaps it could throw an AssertException instead when the "unittest" flag is passed. Just slap @trusted on the part of the framework that catches them. Atila
Re: Catching Errors
On Thursday, 19 January 2017 at 15:43:26 UTC, Jacob Carlborg wrote: On 2017-01-19 15:29, Jack Stouffer wrote: If this is the case, would it not make sense to make it illegal to catch Errors in @safe code? There's the issue with AssertError, which is useful for a unit test framework to catch. Perhaps it could throw an AssertException instead when the "unittest" flag is passed. Or, you can mark that unit test block as @system and have @safe tests in another block.
Re: Catching Errors
On 2017-01-19 15:29, Jack Stouffer wrote: If this is the case, would it not make sense to make it illegal to catch Errors in @safe code? There's the issue with AssertError, which is useful for a unit test framework to catch. Perhaps it could throw an AssertException instead when the "unittest" flag is passed. -- /Jacob Carlborg
Re: Catching Errors
On Thursday, 19 January 2017 at 14:29:46 UTC, Jack Stouffer wrote: From what I understand, the difference between an Exception and and Error is that Errors signal your program has entered into an invalid state. For example, going past the end of an array and attempting to access that memory. On the flip side, Exceptions signal that something out of the ordinary happened, but with proper handling the program can go on it's merry way. An example being entering 13 as a month in a std.datetime.Date. If this is the case, would it not make sense to make it illegal to catch Errors in @safe code? I would say yes. This sounds plausible.
Catching Errors
From what I understand, the difference between an Exception and and Error is that Errors signal your program has entered into an invalid state. For example, going past the end of an array and attempting to access that memory. On the flip side, Exceptions signal that something out of the ordinary happened, but with proper handling the program can go on it's merry way. An example being entering 13 as a month in a std.datetime.Date. If this is the case, would it not make sense to make it illegal to catch Errors in @safe code?
[Issue 12646] New: Catching Errors should imply nothrow
https://issues.dlang.org/show_bug.cgi?id=12646 Issue ID: 12646 Summary: Catching Errors should imply nothrow Product: D Version: D2 Hardware: All OS: All Status: NEW Keywords: rejects-valid Severity: normal Priority: P1 Component: DMD Assignee: nob...@puremagic.com Reporter: andrej.mitrov...@gmail.com - void func() { } // ok void test1() nothrow { try { func(); } catch (Exception th) { } } // Error: function 'test.test2' is nothrow yet may throw void test2() nothrow { try { func(); } catch (Error th) { } } void main() { } - --
[Issue 12646] Catching Errors should imply nothrow
https://issues.dlang.org/show_bug.cgi?id=12646 Andrej Mitrovic andrej.mitrov...@gmail.com changed: What|Removed |Added Blocks||12645 --
[Issue 12646] Catching Errors should imply nothrow
https://issues.dlang.org/show_bug.cgi?id=12646 Andrej Mitrovic andrej.mitrov...@gmail.com changed: What|Removed |Added Assignee|nob...@puremagic.com|andrej.mitrov...@gmail.com --
[Issue 12646] Catching Errors should imply nothrow
https://issues.dlang.org/show_bug.cgi?id=12646 Andrej Mitrovic andrej.mitrov...@gmail.com changed: What|Removed |Added Keywords||pull --- Comment #1 from Andrej Mitrovic andrej.mitrov...@gmail.com --- https://github.com/D-Programming-Language/dmd/pull/3497 --
[Issue 12646] Catching Errors should imply nothrow
https://issues.dlang.org/show_bug.cgi?id=12646 Andrej Mitrovic andrej.mitrov...@gmail.com changed: What|Removed |Added Status|NEW |RESOLVED Resolution|--- |INVALID --- Comment #2 from Andrej Mitrovic andrej.mitrov...@gmail.com --- Sorry, invalid. Exception is derived from Throwable, not Error. My mistake. --
[Issue 12646] Catching Errors should imply nothrow
https://issues.dlang.org/show_bug.cgi?id=12646 Kenji Hara k.hara...@gmail.com changed: What|Removed |Added Blocks|12645 | --