En Thu, 11 Sep 2008 10:43:08 -0300, john <[EMAIL PROTECTED]> escribió:

I wrapped some fortran code using F2PY and need to be able to catch
fortran runtime errors to run the following:

[reindented]
# "grid" is a wrapped fortran module
# no runtime errors incurred when run with the correct inputs for
filetype
#-------------------------------
def readGrid( self, coord='xyz' ):
  mg = ( '.FALSE.', '.TRUE.' )
  form = ( 'FORMATTED', 'UNFORMATTED' )
  success = False
  for m in mg:
    for f in form:
      try:
        if coord == 'xyz':
          self.grid.readxyz( self.filename, f, m )
          success = True
        elif coord == 'xyrb':
          self.grid.readxyrb( self.filename, f, m )
          success = True
        else:
          import sys
          print 'gridtype "' + str(coord) + '" not supported. ' \
              + '<IO.Plot3d.Plot3d.read>'
      except:
        continue
  if not success:
    import sys
print 'gridfile "' + str(self.filename) + '" not read in any recognized format' \
        + ' <IO.Plot3d.Plot3d.read>'
#----------------------------

I suppose you want to stop trying other formats after a successful read; in that case put a break statement just below both success=True. If coord is unrecognized, the code above prints the same message 4 times. Instead of printing a message, in those cases usually an exception is raised, letting a higher layer handle the error. And using string interpolation is a lot easier than building the message in parts: raise ValueError('gridtype "%s" not supported. <IO.Plot3d.Plot3d.read>' % coord) If you want to catch errors on the Fortran code *only*, the try/except should be more specific (both in scope and what it catches). The Exception class is the more generic exception that you should catch.

basically, what i want to happen is to try to run 'something' with the
wrapped fortran code and if that doesn't work (error encountered,
etc.) try something else.  is there an easier way to go about doing
this?  is there something i'm missing about catching exceptions here?

I'd reorder the code in this way (untested, of course):

def readGrid(self, coord='xyz'):

    def try_all_formats(read_function, filename):
        mg = ('.FALSE.', '.TRUE.')
        form = ('FORMATTED', 'UNFORMATTED')
        success = False
        for m in mg:
            for f in form:
                try:
                    read_function(filename, f, m)
                    success = True
                    break
                except Exception, e:
                    # this line only for debugging purposes
                    print "error %r when using m=%r f=%r" % (e, m, f)
                    continue
        if not success:
            raise ValueError('gridfile "%s" not read '
                   'in any recognized format '
                   '<IO.Plot3d.Plot3d.read>' % filename)

    if coord == 'xyz':
        try_all_formats(self.grid.readxyz, self.filename)
    elif coord == 'xyrb':
        try_all_formats(self.grid.readxyrb, self.filename)
    else:
        raise ValueError('gridtype "%s" not supported. '
                '<IO.Plot3d.Plot3d.read>' % coord)

I don't know about F2PY but the values ('.FALSE.', '.TRUE.') seem suspicious. AFAIR, .FALSE. and .TRUE. are the Fortran spellings of False and True in Python - they're not strings, but boolean values. So maybe the right way is to use
        mg = (False, True)

Your code above was catching and ignoring everything, even this error, if it happened.

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to