Re: General::aofil-closing files after manual abort
- To: mathgroup at smc.vnet.net
- Subject: [mg41018] Re: [mg40860] General::aofil-closing files after manual abort
- From: Omega Consulting <info at omegaconsultinggroup.com>
- Date: Tue, 29 Apr 2003 05:23:18 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
At 05:46 AM 4/22/2003, Tom Hardy wrote: >Hi, > >Searched around and couldn't find an answer. I have some long calculations >that write to files and also the display. If I see something is wrong do a >manual abort. However, if I try to rerun the program Mathematica leaves the >files open and get the subject error message. Played with catch on abort >etc. The only way I can get back and run the program is by exiting >Mathematica and >restarting. Is there a way to have the program close the files on an abort? >Thanks. The standard way to handle this is with CheckAbort. If an abort occurs, the second argument is evaluated. In[1]:= stream=OpenRead["test"]; CheckAbort[Pause[10]; Close[stream], Close[stream]; Abort[]] Out[1]= $Aborted So even if you abort, the stream is closed. In[3]:= Streams[] Out[3]= {OutputStream[stdout,1],OutputStream[stderr,2]} It's a good idea to call Abort[] after you're done cleaning things up, because CheckAbort effectively nullifies the original abort. If I had something after the CheckAbort, or the CheckAbort was inside something else, then it could continue. Usually, you don't want that to happen. You want a complete abort. Calling Abort[] gives that effect. Also, I hate having to repeat the cleanup code in both arguments, so I usually use the following function which works somewhat like the try-finally mechanism in Java. In[4]:= Attributes[Try] = {HoldAll}; In[5]:= Try[expr_, finally_]:= CheckAbort[expr; finally, finally; Abort[]] I find this much simpler to code. In[6]:= stream = OpenRead["test"]; Try[Pause[10], Close[stream]] -------------------------------------------------------------- Omega Consulting "The final answer to your Mathematica needs" http://omegaconsultinggroup.com