Pregunta

Cuando lo que desea es hacer un try-excepto que sin el manejo de la excepción, ¿cómo lo haces en Python?

es el siguiente de la manera correcta de hacerlo?

try:
    shutil.rmtree(path)
except:
    pass
¿Fue útil?

Solución

try:
  doSomething()
except: 
  pass

o

try:
  doSomething()
except Exception: 
  pass

La diferencia es que el primero también se pondrá al día KeyboardInterrupt, SystemExit y cosas por el estilo, que se derivan directamente de exceptions.BaseException, no exceptions.Exception
Ver documentación para más detalles:.

Otros consejos

.

Por lo general es considerada la mejor práctica para coger sólo los errores que le interesan En el caso de shutil.rmtree es probablemente OSError:

>>> shutil.rmtree("/fake/dir")
Traceback (most recent call last):
    [...]
OSError: [Errno 2] No such file or directory: '/fake/dir'

Si desea ignorar en silencio que el error, puede hacer:

try:
    shutil.rmtree(path)
except OSError:
    pass

¿Por qué? que (de alguna manera) decir accidentalmente pasar la función de un entero en lugar de una cadena, como:

shutil.rmtree(2)

Se le dará el error "TypeError: coaccionar a Unicode: Cadena de necesidad o tampón, Int encontrado" - es probable que no quieren hacer caso omiso de eso, lo que puede ser difícil de depurar

Si definitivamente desea ignorar todos los errores de captura, Exception en lugar de una declaración except: desnudo. Una vez más, ¿por qué?

Si no se especifica un capturas de excepción todos excepción, incluyendo la excepción SystemExit que por ejemplo utiliza sys.exit():

>>> try:
...     sys.exit(1)
... except:
...     pass
... 
>>>

Compare esto con el siguiente, que sale correctamente:

>>> try:
...     sys.exit(1)
... except Exception:
...     pass
... 
shell:~$ 

Si desea escribir código cada vez mejor comportarse, la OSError excepción puede representar varios errores, pero en el ejemplo anterior, sólo quieren ignorar Errno 2, por lo que podría ser aún más específico:

try:
    shutil.rmtree(path)
except OSError, e:
    if e.errno == 2:
        # suppress "No such file or directory" error
        pass
    else:
        # reraise the exception, as it's an unexpected error
        raise

import errno y cambiar el if a if e.errno == errno.ENOENT:

  

Cuando lo que desea es hacer un intento de captura sin manipular la excepción, ¿cómo lo haces en Python?

Depende de lo que entendemos por "manipulación".

Si se refiere a cogerlo sin tomar ninguna acción, el código que envió va a funcionar.

Si usted quiere decir que usted quiere tomar una decisión sobre una excepción sin detener la excepción de ir arriba en la pila, entonces usted quiere algo como esto:

try:
    do_something()
except:
    handle_exception()
    raise  #re-raise the exact same exception that was thrown

En primer lugar cito la respuesta de Jack O'Connor este hilo . El hilo referenciado quedó cerrado, así que escribo aquí:

"Hay una nueva manera de hacer esto viene en Python 3.4:

from contextlib import suppress

with suppress(Exception):
    # your code

Esto es la confirmación de que se añadió: http://hg.python.org/cpython/rev / 406b47c64480

Y aquí está el autor, Raymond Hettinger, hablando de esto y todo tipo de otras picor Python: https: / /youtu.be/OSGv2VnC0go?t=43m23s

Mi Además de esto es el equivalente Python 2.7:

from contextlib import contextmanager

@contextmanager
def ignored(*exceptions):
    try:
        yield
    except exceptions:
        pass

A continuación, se utiliza como si fuera en Python 3.4:

with ignored(Exception):
    # your code

Para completar:

>>> def divide(x, y):
...     try:
...         result = x / y
...     except ZeroDivisionError:
...         print "division by zero!"
...     else:
...         print "result is", result
...     finally:
...         print "executing finally clause"

... en el Guía de aprendizaje de .

Tenga en cuenta también que puede capturar la excepción siguiente:

>>> try:
...     this_fails()
... except ZeroDivisionError as detail:
...     print 'Handling run-time error:', detail
  

Cómo ignoran correctamente excepciones?

Hay varias maneras de hacer esto.

Sin embargo, la elección de ejemplo tiene una solución simple que no cubre el caso general.

específicas para el ejemplo:

En lugar de

try:
    shutil.rmtree(path)
except:
    pass

Haga lo siguiente:

shutil.rmtree(path, ignore_errors=True)

Este es un argumento específico para shutil.rmtree. Se puede ver la ayuda en él haciendo lo siguiente, y verá que también puede permitir la funcionalidad de errores también.

>>> import shutil
>>> help(shutil.rmtree)

Dado que esto sólo se refiere al caso de la estrecha ejemplo, voy a demostrar además cómo manejar la situación si no existieran esos argumentos de palabra clave.

Enfoque general

Desde el anterior sólo cubre el caso de la estrecha ejemplo, voy a demostrar además cómo manejar la situación si no existieran esos argumentos de palabra clave.

Nuevo en Python 3.4:

Puede importar el gestor de contexto suppress:

from contextlib import suppress

Sin embargo, sólo suprimir la excepción más específica:

with suppress(FileNotFoundError):
    shutil.rmtree(path)

Usted silencio ignorar una FileNotFoundError:

>>> with suppress(FileNotFoundError):
...     shutil.rmtree('bajkjbkdlsjfljsf')
... 
>>> 

Desde el docs :

  

Al igual que con cualquier otro mecanismo que suprime por completo excepciones,   Este gestor de contexto debe ser utilizado sólo para cubrir errores muy específicos   donde continúa en silencio con la ejecución del programa es conocido por ser el   lo que hay que hacer.

Tenga en cuenta que suppress y FileNotFoundError solamente están disponibles en Python 3.

Si usted quiere que su código para trabajar en Python 2, así, consulte la sección siguiente:

Python 2 y 3:

  

Cuando lo que desea es hacer un try / excepto que sin el manejo de la excepción,   ¿cómo se hace en Python?

     

es el siguiente de la manera correcta de hacerlo?

try :
    shutil.rmtree ( path )
except :
    pass

En Python 2 Código compatibles, pass es la forma correcta de tener una declaración de que es un no-op. Pero cuando se hace una except: desnuda, eso es lo mismo que hacer except BaseException: que incluye GeneratorExit, KeyboardInterrupt y SystemExit, y, en general, que no quieren coger esas cosas.

De hecho, debe ser lo más específico en el nombramiento de la excepción que pueda.

Aquí es parte de la Python (2) excepción jerarquía y como se puede ver, si se captura excepciones más generales, puede ocultar los problemas no esperaba:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StandardError
      |    +-- BufferError
      |    +-- ArithmeticError
      |    |    +-- FloatingPointError
      |    |    +-- OverflowError
      |    |    +-- ZeroDivisionError
      |    +-- AssertionError
      |    +-- AttributeError
      |    +-- EnvironmentError
      |    |    +-- IOError
      |    |    +-- OSError
      |    |         +-- WindowsError (Windows)
      |    |         +-- VMSError (VMS)
      |    +-- EOFError
... and so on

Es posible que desee tomar un OSError aquí, y tal vez la excepción no tener en cuenta es si no hay un directorio.

Podemos obtener que número de error específico de la biblioteca errno, y volver a subir si no tenemos lo siguiente:

import errno

try:
    shutil.rmtree(path)
except OSError as error:
    if error.errno == errno.ENOENT: # no such file or directory
        pass
    else: # we had an OSError we didn't expect, so reraise it
        raise 

Nota, un aumento desnuda plantea la excepción original, que es probablemente lo que quiere en este caso. Escrito de manera más concisa, ya que no necesitamos realmente pass explícitamente de código en el manejo de excepciones:

try:
    shutil.rmtree(path)
except OSError as error:
    if error.errno != errno.ENOENT: # no such file or directory
        raise 
  

Cuando lo que desea es hacer un intento de captura sin manipular la excepción,   ¿cómo se hace en Python?

Esto le ayudará a imprimir lo que la excepción es :( es decir, tratar de captura sin manipular la excepción e imprimir la excepción.)

import sys
try:
    doSomething()
except:
    print "Unexpected error:", sys.exc_info()[0]
try:
      doSomething()
except Exception: 
    pass
else:
      stuffDoneIf()
      TryClauseSucceeds()

Para su información la cláusula más puede ir después de todas las excepciones y sólo se ejecutará si el código en el intento no causa una excepción.

En Python, que maneja las excepciones similares a otro idioma, pero la diferencia es un poco de diferencia de sintaxis, por ejemplo,

try:
    #Your code in which exception can occur
except <here we can put in a particular exception name>:
    # We can call that exception here also, like ZeroDivisionError()
    # now your code
# We can put in a finally block also
finally:
    # Your code...

que necesitaba para ignorar los errores en múltiples comandos y fuckit hizo el truco

import fuckit

@fuckit
def helper():
    print('before')
    1/0
    print('after1')
    1/0
    print('after2')

helper()

Simplemente subir la excepción relevante, al igual que este:

try:
     raise NameError('Joan')
 except NameError:
     print 'An exception just raised again by Joan!'
     raise

Tan simple como eso. :)

Para más detalles, hacer leer esta documentación: https://docs.python.org/3.6/tutorial/errors.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top