Class Type Parameters
Hans-Eric Grönlund
hasse42g at gmail.com
Wed Jan 23 22:57:26 PST 2008
> Also, this function would be a great place to use a lazy void parameter for
> the toTry parameter ;)
Pardon me for being ignorant, but could you elaborate a little on this subject?
Jarrett Billingsley Wrote:
> "Christopher Wright" <dhasenan at gmail.com> wrote in message
> news:fn2bqa$25rl$1 at digitalmars.com...
> >
> > Closest you could come, if you really didn't want to use a template, is:
> > void retryable(ClassInfo info, int times, void delegate() totry) {
> > for (int i = 0; i < times; i++) {
> > try {
> > totry();
> > break;
> > } catch (Exception e) {
> > if (e.classinfo is info) continue; else throw e;
> > }
> > }
> > }
> >
> > retryable(AbandonedMutexException.classinfo, 5, {writefln("Hi!");});
>
> The only possible issue I could see with that would be if an exception were
> thrown that was derived from the type that you passed in, which, according
> to normal exception behavior, should still be caught. What you have to do
> then is perform a dynamic cast. There's no syntax for this, but you can
> hack around with some of the runtime functions to do the same thing. Place:
>
> extern(C) Object _d_dynamic_cast(Object o, ClassInfo c);
>
> somewhere in your module, then in the catch clause of retryable:
>
> catch(Exception e)
> {
> if(_d_dynamic_cast(e, info))
> continue;
> else
> throw e;
> }
>
> That _should_ work. It's doing the same thing as the cast operator would
> but without the pretty syntax.
>
> Also, this function would be a great place to use a lazy void parameter for
> the toTry parameter ;)
>
>
More information about the Digitalmars-d-learn
mailing list