Boost logo

Boost :

From: Andrey Semashev (andysem_at_[hidden])
Date: 2005-08-22 13:26:47


"David Abrahams" <dave_at_[hidden]>
wrote in message news:<uy86u3osd.fsf_at_[hidden]>...
> "Andrey Semashev" <andysem_at_[hidden]> writes:
>
> Andrey, your mailer wraps long lines; you might want to put your
> code
> in an attachment next time.
> http://www.boost.org/more/discussion_policy.htm#longlines

Sorry, I shall try to do so next time.

> > void foo(int n) {
> > leaving_scope_guard<
> > guard::with_catcher< // Indicate that we're expecting some
> > // exceptions to be thrown by
> > // guarded_foo
> > CHandler, // This is the class, which object is to
> > // process exceptions caught
> > guard::exceptions< std::bad_cast,
> > std::bad_alloc, my_exception
> > >, // Exceptions to be caught (up to
> > // 10 exception types supported)
>
> This part worries me thes reasons:
>
> 0. I doubt its utility.

The guard::with_catcher template class is actually a calling policy. In this
case the policy catches exceptions specified. Of course, we
could write a wrapper function that never throws and use it with scope
guard. But why write if it can be generated?

> 1. It induces a catch block and in many cases a catch block
> should be avoided when possible in exception-neutral code.

Yes, in case of this policy (with_catcher) it does. But if you are sure you
don't need exception handling, you can use another policy (namely
simple_invoker) which is the default one. In that case the guard set up
would look as follows:

leaving_scope_guard< > guard(bind(&guarded_foo, n,
  "called from foo")); // Guard object

In this case there will be no try/catch blocks at all. In fact, I'm thinking
about typedef'ing this form into something shorter (maybe
"simple_guard"?).

> 2. I think it may encourage abuse with the same lure that
> exception-specifications present to the casual user.

I can't say I quite agree with you (if I got your opinion correctly). A tool
is just a tool and of course it may be used incorrectly or
ineffectively. Besides, I have a doubt that a user would prefer to use
exception-parameterized guards against simple ones without having real
intends to do so. For example, if a guarded function has an exception
specification, we have no right to hope it will not throw it. So we
shall have to catch it anyway.

> > boost::shared_ptr<
> > CHandler > // An optional parameter
> > // describes the way the
> > // pointer to CHandler
> > // object should be stored.
> > // The default value would
> > // be CHandler*.
>
> Do we really need all this parameterization? I think a generalized
> scopeguard is a good idea, but this smells like overkill.

Do you mean this last template parameter in particular? with_catcher policy
needs it because it cannot possibly know what to do with the
handler object after the exception is processed. In many cases you won't
need to worry about it and will be passing this as a pointer to the
handler object. In such cases you can simply skip this template argument.
But sometimes you might want to pass error hanlding to another object and
you will have to guarantee its existance until the guard is
destroyed.

> > >
> > > guard(
> > boost::bind(&guarded_foo, n,
> > "called from foo"),
> > boost::shared_ptr< CHandler >(
> > new CHandler)
> > ); // Guard object
> > // ...
> > }

PS: I attach the source code once more. I hope this time it will be correct.
If it doesn't work this time I can mail it if you'd like me to.

> --
> Dave Abrahams
> Boost Consulting
> www.boost-consulting.com
>
> _______________________________________________
> Unsubscribe & other changes:
> http://lists.boost.org/mailman/listinfo.cgi/boost
>

begin 666 scope_guard.zip
M4$L#!!0``@`(`'0$%C.MBH8`&PD``,(N```-````<V-O<&5?9W5A<F0N:.U:
MZV_;R!'_+ /^'_;.0(X*=+;BQ'G(M@!!T24&;,>PY: M#EC0Y,KBE2()DG+B
M^M2_O3/[(+G+EY3&27#ME\2:W7G/_&9(:>_I3]M;Y"GY?>;YC!"2.&'$Z.W2
MCMW=N3BQE^D\C,D56]C)G-V14>#&[%Z<N7:*7/L'N_U7N_O]_@$GB[.;V&,S
M0MZQ@,6V[_V+N4(ZX=*)RQS?CNW4"X.,:6][:WMKQYL%+G!2>C7^<#%Y=SVZ
M?$O?4PHG0/8"5G&"7('C+UU&?KX)PR3=FRT#!V5G?_1WYU'T<_EB$ 9_at_U;U]
MX[.:&^D]A"2-;2]-]KR$WM@)HW;@4I?%WAUSU^.*0B](62PO;V_M[9$SVXG#
MA"5D!N&]Y6%*O>"6Q.QV":$A3NBRDM-4>#TYOSZ;7(ZF$WHV&E]^H):WB'RZ
M0(G=W[>W.OE'ZYE)V#<)STW""Y-P8!)>FH17)N&U27C3Y7E:QYT&;_J<L'XP
MZG6>7Y^>3O]^,;FR/$A,ER1IO'12$BQ]'W.WLX-D,B#1\L;WG(Q.'E:'=2*G
MD[.+4[3C8G0Y.E.">P3Y`GO!R.2SPR*LQJD4?PQ]D-J>/QCH>FLU@,%O)[\I
MT<B O5*2RQ2!YC)KS1Z/IN/W*@X87L=.G3FQRF8GIUZ23@>#*O'D"6%=\H#\
M'667<NX=MOQ[YD<L/B(;BAT2P4C30RY;?1H,O. N_">C.=<<VM)'%1DI4335
M@%PR&5H+&KT7)STPFTM>8:V_at_84ED.XSP-B8/.E%_at_UX/HX)_()%_at_NF `Q$LZ@
MA.QTB1T-?_.;VUL,;A#\YPJQC\?ABM]"(1T[7@`L'I.9[2>L!P372Q0-RA':
M'XNM:("(J+"@PTU81.F]+-YE+-'$"US/R<SB+MLW"0L<D-_at_Q"ET4=%M+U?1.
M-[-C.O<2`I">)&@C<]*$I'-&0DC#PO9)!%B_8)A/KA.LD_at_DA:9BGB\ALD?#F
M#Q !HE,&O0Q3IE VTQ[FQB>S"RGA6.0*"B+#V2,R)</!X,[VEY#MW&FM"AZ*
MI3H%O V2] G7_at_P'A4:E27R?O""W#K$')&J*+,E7>2C[S<L8!,.<5WN+\.:1O
MBEX4O3=GTU&6Y5Y-0 J=*8TNZ[SF#)T.EC<@H1?XB"%WH>>2NA;,L4./T#4:
MP8.?M]]4``=7`6/Q9,8+9Q;Z?O@)P\&US:#J$ZP5)UQ$N*O G0#_B1F!PK.#
M0A$)?[$//LT]9ZX$@W7Y';46(',0ID0`(SI448V\K+D8;T8L97DW\^'785&V
M!7B"EU?K%I&&CF8-U:;C:V8#DR!3L-++= JI$%T]#WT7`^V2A1W8MTSTMX \
MCC)SID"O(S@*RR1L0M[M+2]JU!+%(4($<P>H$O7P&/R22'E(K03-!15_8%C%
M8.82*C19E?SBORZ,=27)4J3,^TXQI(#&EBI.Q0(MQT'ZL))#0'@5DP+W$E^E
MJ;<LI2(:((MCDY08,P#Z0 M%(6LK`J5NS_at_LUK]YZ,81=%'\H$2>O;YDUW)X8
M56>@4\M614'^)L2)FBZ&8@;JK.Q4XJO\K/DD:19OG)6:>FCQF-N$O<S4K 5(
MT'L=3*^P*M^)^F2CX69L<5UT2W9JOE=L;SVT#4VK>G7K%MW+IP#?N="WFN3D
M'HHT323V`%Y(@KY-%;=.>?4BA2P<YYQ/T3/!_,E+YY2;4-QY#9'<Y[SKLN53
MR:M:N]3D,R]S6UK6-!XEK?C:]KI\JQ.\F:U%_RS1_NJF[-25>2L+GUIB=>QL
M73&-.6<HS<D/:O5\_#9+XWN)(5K#=59DDT*6CPMZKQJP(P>!1!TFV@>KN_@*
MH*:R3T3A8ZGR>X.!`4E9U?K,O_at_[hidden] #_9,#'BW>';R8*S_:];& HH2JM%;.C
M<%D9(VI?RY"LZ'9Q1/Y?*.I2$V5.2R=+C9.]QS_at_221\JH*AIE>(I%-ZI")7,
MN[S.HX27*P+)2Z-H:=4=38DL/%U33W-(W9'>0H:+IU:WIZ+9,+SSLN##M(L%
M/-!"K$:ZKMN22H%LAL/2/W;EEK+Z+[QN]V.SR#RRF_^NK `!%KCS6I8SM^-N
M4?U_at_H&TH?Q)Y!9X#?QV:JG<9/J:"&^3XF/2Y,QUQ$\&+*NT0V6P'R-9/>&R<
MARX`;@25Z*7^/<Q*WQ?KIV14O5 !C+KL(AH6HS88<!"M-K[.HIB)IX9U3 &X
M\FX#S9BJ,LI06^!UI3E0&WD;&]L22E%0BZNZ^UC0JT&NVA<JBN_at_HESF4&)JA
MCH*V%C;"GVJK44Z)R(9D=A?&;Z%8UX'@*AE:B]9!<Q6CEMR-D'J".T0]5#=!
M=/$,ZZ>JP_at_SQO;I[!J"9#=.*Y,BP,9@#$^Y)61PM$U:ENA[)L*\4,,OXK&#N
M"W',D-8"9$S>UI'LD?.RQJS9-'U_T42L,U(49]-,T:6O.53,<*PU55JLD6-%
MLV?]N6)85#-8C-6>OVU$>OE+K(2E?-(L(Q@^87"_")=)<>PD#=_&C,XFU(IB
M./O<(Q&H@#^Z1!!V=B2AB;O,O(X&Z<9)0#Z.R2=\IRA>,*(;^#A(]OYQPE]B
MPR,ZI:<GYQ-*"?]J"=\<.F$<+Z,4_at_6O'FZF7B!8]NQK3CY/++GGRA*@/9'A,
MGCWO]XLQ.)V,/IZ<ORO:J=+7)?B=A'RU6SDAAU5!D$\>/3@;?[@^GTXN*>V2
M3.AAHVXZ^9NZV<,'7%Y"U(=G?_'1FT$!]-1KT78+Y9G$I^+3]5%1GGXM?[ ^
MTFT`AX>-3K//=7[G-A\6PU\,.V\AFMU'?QBMRL47YZ!1PV&E59B0)K:_2)::
M7=13Q_R$?;,6$OW^/]8_IM/?K7DR0_[?.97YV:AM`A<&%$RZC6>4'M3QY&)Z
M\N'\BCZS]&_K^UWC1P?]5A'[IHB>(4+\=&5M`TKLK18\;[7 ).PWF;2&0R5Y
MK3:^V-Q&D_"\R>@OB4%)0:L7!U_!"Y/PHLFMKQ*VDL96/U\^AI\FX:#)\<>)
M=,F$UDB\^B:1, DOFT+SC9)3LJDU5J^_3ZQ,PJNFX'VO?):,;(WFFQ\DFB;A
M=5-X?Y_at_2*%G=O_at_KT?]2 FX0W31GX<<NFY(9\:S&&E2^0+UP6\D4,9&M9_/VT
M_J5MS:GZ;4+=L?Z+B)I;V8\":\Z-;Y77NT7U[;7\T^__`%!+`0(4`!0``@`(
M`'0$%C.MBH8`&PD``,(N```-````````````( ````````!S8V]P95]G=6%R
99"YH4$L%!@`````!``$`.P```$8)````````
`
end


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk