//WARNING: Don't return out of a catch{}.  This
//might get fixed.

//You can use PutExcept() in a catch statement
//and it will report args.
Bool Prompt(I64 i)
{
    "%d ", i;
    return YorN;
}

U0 D1()
{
    "D1\n";
    if (Prompt(1))
        throw('Point1');
    if (Prompt(2))
        throw('Point2');
}

U0 D2()
{
    "D2\n";
    try
    {
        D1;
        if (Prompt(4))
            throw('Point4');
    }
    catch
    {
        "D2 handler\n"
        "Ch:%c:%P\n", Fs->except_ch, Fs->except_callers[0];
        if (Fs->except_ch == 'Point1')
        {
            "Caught in D2\n";
            Fs->catch_except = TRUE;
        }
    }
}

U0 Demo()
{
    try
    {
        D2;
        if (Prompt(3))
            throw('Point3');
    }
    catch
    {
        "Demo handler\n"
                    "Ch:%c:%P\n", Fs->except_ch, Fs->except_callers[0];
        Fs->catch_except = TRUE;
    }
}

Demo;