View mode: basic / threaded / horizontal-split · Log in · Help
March 09, 2012
Assert and the optional Message
I am new to D and have been playing around with Assert. I figured 
that using a message with assert would be very helpful, but 
unfortunately when the message is printed to the console, the 
console closes and my program ends.

Is there any way to get a more permanent message?

I've tried adding system("PAUSE") and it doesn't have any effect.

Is there any way I could have the assert function print the 
message to a file?

I'm using VS2010 and Visual D if that is of any importance.
March 09, 2012
Re: Assert and the optional Message
On Friday, March 09, 2012 08:42:25 Chris Pons wrote:
> I am new to D and have been playing around with Assert. I figured
> that using a message with assert would be very helpful, but
> unfortunately when the message is printed to the console, the
> console closes and my program ends.
> 
> Is there any way to get a more permanent message?
> 
> I've tried adding system("PAUSE") and it doesn't have any effect.
> 
> Is there any way I could have the assert function print the
> message to a file?
> 
> I'm using VS2010 and Visual D if that is of any importance.

Assertions throw an AssertError when they fail. No statements after the 
assertion failure will be run. Rather, the AssertError will unwind the stack 
until it exits main. When it exits main, it gets caught, and it's printed out. 
Whatever message you gave assert it is part of that. It has nothing to do with 
files.

If you want to specifically write to a file, then you're going to have to check 
with your own function, write to the file if it fails, and then assert 
afterwards. And I'd argue that that is horribly ugly and should be avoided. 
Screwing with your program like that just because your dev environment is 
annoying enough to close its console window when the program exits isn't a 
good idea.

What you should almost certainly be doing is changing Visual Studio's settings 
so that it doesn't close the Window when the program exits. I know that it's 
possible. I've done it, but I rarely use Windows, and I don't remember what 
you have to do. So, unfortunately, I can't be of much help to you there, but 
that's the solution that you should almost certainly be using. If no one else 
around here can post how to do it, then I would think that you'd be able to 
find how via google easily enough.

- Jonathan M Davis
March 09, 2012
Re: Assert and the optional Message
Ok, thank you for the advice. I will look into it.
March 09, 2012
Re: Assert and the optional Message
Any idea why, system("PAUSE") does work?
March 09, 2012
Re: Assert and the optional Message
On Friday, March 09, 2012 09:20:33 Chris Pons wrote:
> Any idea why, system("PAUSE") does work?

Because that line never gets run. A failed assertion throws an AssertError 
which skips everything until it gets handled by the runtime after it exits 
main. So, if you have

assert(condition);
system("PAUSE");

the second line will never execute as long as condition is false.

- Jonathan M Davis
March 09, 2012
Re: Assert and the optional Message
On Friday, 9 March 2012 at 07:55:56 UTC, Jonathan M Davis wrote:
> What you should almost certainly be doing is changing Visual 
> Studio's settings
> so that it doesn't close the Window when the program exits. I 
> know that it's
> possible. I've done it, but I rarely use Windows, and I don't 
> remember what
> you have to do. So, unfortunately, I can't be of much help to 
> you there, but
> that's the solution that you should almost certainly be using. 
> If no one else
> around here can post how to do it, then I would think that 
> you'd be able to
> find how via google easily enough.
>
> - Jonathan M Davis

Are you sure you've tested this with D? Because VisualD doesn't 
support that yet, afaik.
March 09, 2012
Re: Assert and the optional Message
On Fri, 09 Mar 2012 08:20:33 -0000, Chris Pons <cmpons@gmail.com> wrote:

> Any idea why, system("PAUSE") does work?

As Jonathan says, assert throws AssertError... which means, if you wanted  
to you could catch it, for example...

module asserting;

import std.stdio;
import core.exception;

debug
{
    import std.c.windows.windows;
    extern (C) int kbhit();
}

void main()
{
    try
    {
        assert(false, "testing assert");
    }
    catch(AssertError e)
    {
        debug
        {
            writefln("Assertion failed: %s", e);
            writefln("Press any key to exit...");
            while(!kbhit())
                Sleep(1);
        }
        throw e;
    }
}

So, for debug builds your exe will output the assertion manually, and wait  
for a key press.  Then re-throw the assertion (resulting in the d runtime  
outputting the assertion again).  In release, no pause.

Note: kbhit and Sleep are windows specific (sleep would be the unix  
equivalent, not sure on one for kbhit).

Regan Heath

-- 
Using Opera's revolutionary email client: http://www.opera.com/mail/
March 09, 2012
Re: Assert and the optional Message
On Friday, March 09, 2012 10:55:10 Mars wrote:
> On Friday, 9 March 2012 at 07:55:56 UTC, Jonathan M Davis wrote:
> > What you should almost certainly be doing is changing Visual
> > Studio's settings
> > so that it doesn't close the Window when the program exits. I
> > know that it's
> > possible. I've done it, but I rarely use Windows, and I don't
> > remember what
> > you have to do. So, unfortunately, I can't be of much help to
> > you there, but
> > that's the solution that you should almost certainly be using.
> > If no one else
> > around here can post how to do it, then I would think that
> > you'd be able to
> > find how via google easily enough.
> > 
> > - Jonathan M Davis
> 
> Are you sure you've tested this with D? Because VisualD doesn't
> support that yet, afaik.

I've never used Visual Studio with D, and I wouldn't expect telling it not 
close the window after execution to be any different in D than it is in C++, 
but I don't know. Regardless, contorting your program to try and print assert 
messages to a file just because VisualD has problems with closing the Window on 
you is a _bad_ idea IMHO. If it really has that problem, and you really need 
to see the assertion without running the debugger on it, I'd advise just 
running the program on the command line.

- Jonathan M Davis
March 09, 2012
Re: Assert and the optional Message
On Friday, March 09, 2012 11:03:38 Regan Heath wrote:
> On Fri, 09 Mar 2012 08:20:33 -0000, Chris Pons <cmpons@gmail.com> wrote:
> > Any idea why, system("PAUSE") does work?
> 
> As Jonathan says, assert throws AssertError... which means, if you wanted
> to you could catch it, for example...
> 
> module asserting;
> 
> import std.stdio;
> import core.exception;
> 
> debug
> {
>      import std.c.windows.windows;
>      extern (C) int kbhit();
> }
> 
> void main()
> {
>      try
>      {
>          assert(false, "testing assert");
>      }
>      catch(AssertError e)
>      {
>          debug
>          {
>              writefln("Assertion failed: %s", e);
>              writefln("Press any key to exit...");
>              while(!kbhit())
>                  Sleep(1);
>          }
>          throw e;
>      }
> }
> 
> So, for debug builds your exe will output the assertion manually, and wait
> for a key press.  Then re-throw the assertion (resulting in the d runtime
> outputting the assertion again).  In release, no pause.
> 
> Note: kbhit and Sleep are windows specific (sleep would be the unix
> equivalent, not sure on one for kbhit).

Bet advised that catching anything not derived from Exception is generally a 
_bad_ idea (most of which are derived from Error), and AssertError is _not_ 
derived from Exception but rather Error. AssertErrors are not guaranteed to 
invoke finally blocks, scope statements, or destructors. Your program is in an 
invalid state when you catch an Error. So, while it may work in this 
particular case, it is _not_ something that you should be doing in general. By 
far the worst thing to do would be to catch an Error and then continue 
executing. Errors are _supposed_ to kill your program.

- Jonathan M Davis
March 09, 2012
Re: Assert and the optional Message
On 3/9/2012 4:42 PM, Chris Pons wrote:
> I am new to D and have been playing around with Assert. I figured that
> using a message with assert would be very helpful, but unfortunately
> when the message is printed to the console, the console closes and my
> program ends.
>
> Is there any way to get a more permanent message?
>
> I've tried adding system("PAUSE") and it doesn't have any effect.
>
> Is there any way I could have the assert function print the message to a
> file?
>
> I'm using VS2010 and Visual D if that is of any importance.
>

In this case, you can just open up a command window, navigate to your 
executable directory, and execute the app manually from the command 
line. Then you don't have to worry about it closing.

Of course, this doesn't work if you are using the default output 
directories for your executable, but you have resources in the working 
directory. When I use VisualD, I generally configure my executables to 
all go a single bin directory (foo.exe for release, foo_dbg.exe for 
Debug). Then I keep a command window open in the background. That way, 
if I need to run from the command line, it's easy to do so without any 
copying around.
« First   ‹ Prev
1 2 3 4 5
Top | Discussion index | About this forum | D home