On 9/28/16 9:10 AM, pineapple wrote:
I submitted a PR addressing some of the mentioned criticisms:
https://github.com/dlang/DIPs/pull/46

Thanks. The Phobos examples compared:

(1)

// Current
unittest
{
    bool ok = true;
    try
    {
        auto r2 = assumeSorted([ 677, 345, 34, 7, 5 ]);
        debug ok = false;
    }
    catch (Throwable)
    {
    }
    assert(ok);
}
// With try/else
unittest
{
    try
    {
        auto r2 = assumeSorted([ 677, 345, 34, 7, 5 ]);
    }
    catch (Throwable)
    {
    }
    else assert(ok);
}
// Within existing D
unittest
{
    try
    {
        auto r2 = assumeSorted([ 677, 345, 34, 7, 5 ]);
    }
    catch (Throwable)
    {
        return;
    }
    assert(0);
}

(2)

// Current
    bool failed = false;
    try
    {
        auto d = c.get!(int);
    }
    catch (Exception e)
    {
        //writeln(stderr, e.toString);
        failed = true;
    }
    assert(failed); // :o)
// With try/else
    try
    {
        auto d = c.get!(int);
    }
    catch (Exception e)
    {
    }
    else
    {
        assert(0); // :o)
    }
// Within existing D
    assertThrown(c.get!(int));

(An argument here may be made that assertThrown is "cheating".)

(3)

// Current
void assertNot(string s)
{
    bool b = false;
    try { decode(s,DecodeMode.STRICT); }
    catch (DecodeException e) { b = true; }
    assert(b,s);
}

// With try/else
void assertNot(string s)
{
    try { decode(s,DecodeMode.STRICT); }
    catch (DecodeException e) {}
    else { assert(0, s); }
}
// With scope
void assertNot(string s)
{
    try { scope(success) assert(0, s); decode(s,DecodeMode.STRICT); }
    catch (DecodeException e) {}
}

The burden is to make the case that the try/else variant is better than the two others.


Andrei

Reply via email to