To fix the bug you mentioned in the comment: you can change the signature of first overloaded `handle` as like following, and remove the third one.

```d
CommonType!(T1, T2) handle(E=Throwable,T1, T2)(lazy T1 expression,lazy T2 errorHandler)
if (!is(CommonType!(T1, T2) == void))
```

The return type of `handle` is calculated by `CommonType!(T1, T2)` from the type of `expression` and `errorHandler`.
The template constraint rejects to instantiate `hander` with unrelated two types, e.g. `int` and `string`.

After the change, next unit test will pass as expected.
```d
unittest
{
    assert(null.handle!Exception([1, 2]) == null);          // typeof(null) vs int[]
    assert((new Object()).handle!Exception(null) !is null);  // Object vs typeof(null)
    static assert(!__traits(compiles, 1.handle!Exception("oops")));  // int and string cannot compile
}
```