From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13507 invoked from network); 4 Oct 2005 17:28:52 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 4 Oct 2005 17:28:52 -0000 Received: (qmail 67130 invoked from network); 4 Oct 2005 17:28:45 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 4 Oct 2005 17:28:45 -0000 Received: (qmail 10876 invoked by alias); 4 Oct 2005 17:28:43 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 21837 Received: (qmail 10866 invoked from network); 4 Oct 2005 17:28:42 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 4 Oct 2005 17:28:42 -0000 Received: (qmail 66865 invoked from network); 4 Oct 2005 17:28:42 -0000 Received: from ns9.hostinglmi.net (213.194.149.146) by a.mx.sunsite.dk with SMTP; 4 Oct 2005 17:28:42 -0000 Received: from 212.red-80-35-44.staticip.rima-tde.net ([80.35.44.212] helo=localhost) by ns9.hostinglmi.net with esmtpa (Exim 4.52) id 1EMqap-0000Vk-3I; Tue, 04 Oct 2005 19:28:43 +0200 Date: Tue, 4 Oct 2005 19:29:10 +0200 From: DervishD To: Bart Schaefer Cc: zsh-workers@sunsite.dk Subject: Re: Exception handling and "trap" vs. TRAPNAL() Message-ID: <20051004172910.GA21195@DervishD> Mail-Followup-To: Bart Schaefer , zsh-workers@sunsite.dk References: <20051001202856.GA134@DervishD> <1051002044052.ZM28373@candle.brasslantern.com> <20051002190940.437F9866F@pwstephenson.fsnet.co.uk> <1051002195518.ZM2163@candle.brasslantern.com> <20051002230027.GA194@DervishD> <1051003013758.ZM3107@candle.brasslantern.com> <20051003090121.GC278@DervishD> <1051003162109.ZM4533@candle.brasslantern.com> <20051003175913.GB3231@DervishD> <1051004163144.ZM32294@candle.brasslantern.com> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1051004163144.ZM32294@candle.brasslantern.com> User-Agent: Mutt/1.4.2.1i Organization: DervishD X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - ns9.hostinglmi.net X-AntiAbuse: Original Domain - sunsite.dk X-AntiAbuse: Originator/Caller UID/GID - [0 0] / [47 12] X-AntiAbuse: Sender Address Domain - dervishd.net X-Source: X-Source-Args: X-Source-Dir: X-Spam-Checker-Version: SpamAssassin 3.0.4 (2005-06-05) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.0.4 Hi Bart :) * Bart Schaefer dixit: > : I want to replace this code: > : > : command1 && {# handle here some possible error probably exiting} > : command2 && {# handle here exactly the same error as before} > : ... > : commandn && {# incredible, here we must handle a similar error} > : > : with this one: > : > : trap 'throw commonerror$LINENO' ZERR > : { > : command1 > : command2 > : command3 > : } always { > : # Here we catch and handle the common error > : # In the exception name we have the line number, > : # just in case we want to fine tune error handling > : } > First of all, note that unless command3 is return, the always block > is going to execute regardless of whether there has been an error. Well, I was going to use a test in the always block to see if an exception was thrown, using catch or testing for "EXCEPTION" and "TRY_BLOCK_ERROR" manually. That's not an issue. > How about: > > function common_error() { > # Here we catch and handle the common error > # In the ERROR_LINE variable we have the line number, > # and in the ERROR variable we have the $? status, > # just in case we want to fine tune error handling > } > > trap 'ERROR=$?; ERROR_LINE=$LINENO; return $ERROR' ZERR > trap common_error EXIT > > command1 > command2 > command3 > > trap - EXIT ZERR > > Note also for reference that > trap 'return $?' ZERR > is roughly equivalent to > setopt ERR_RETURN Man, you're the f. boss. I NEVER thought about this, which doesn't need throw nor an always block. Thanks a lot for the help, Bart, this is a very good solution, much better, even, than using always blocks. Just one note: why should be always blocks needed at all if you can use this kind of solutions? As long as you don't cause ZERR to be raised in "common_error()", this solution is much better because you can fine tune (using the "trap" builtin) when do you want to do common handling and when you don't. The only difference I can see is that code in an always block is executed in the current environment and code in "common_error()" is not. Raúl Núñez de Arenas Coronado -- Linux Registered User 88736 | http://www.dervishd.net http://www.pleyades.net & http://www.gotesdelluna.net It's my PC and I'll cry if I want to...