2009-05-05 13 views
6

estoy importando un módulo que plantea el siguiente error en algunas condiciones: RuntimeError: pyparted requiere acceso rootcaptura sólo algunos errores de ejecución en Python

Sé que solo puedo comprobar si hay acceso a la raíz antes de la importación, pero me gustaría saber cómo detectar este tipo de error específico a través de una declaración try/except para referencia futura. ¿Hay alguna forma de diferenciar entre este RuntimeError y otros que puedan surgir?

Respuesta

7

I know that I can just check for root access before the import, but I'd like to know how to catch this spesific kind of error via a try/except statement for future reference. Is there any way to differentiate between this RuntimeError and others that might be raised?

Si el error es causado por una condición específica, entonces creo que la forma más fácil de detectar el error es poner a prueba para la afección, y se puede plantear un error más específica usted mismo. Después de todo el 'error' existe antes de que se produzca el error, ya que en este caso es un problema con el entorno.

Estoy de acuerdo con las anteriores: la coincidencia de texto en un error es una perspectiva aterradora.

4
try: 
    import pyparted 
except RuntimeError: 
    print('RuntimeError is raised') 
    raise 

más en exception handling in tutorial.

En mi opinión, esta situación debería producir ImportError. Y puede hacerlo usted mismo:

try: 
    import pyparted 
except RuntimeError as e: 
    raise ImportError(e) 
1

Sí.

try: 
     import module 
    except RuntimeError: 
     pass 

Las importaciones se interpretan como cualquier otra declaración, no son especiales. Se podría hacer una

if condition: 
    import module 
1
try: 
    import ... 
except RuntimeError: 
    # Do something 
8

Puede comprobar los atributos de la excepción de diferenciar de otras posibles excepciones RuntimeError. Por ejemplo, vuelva a generar el error si no coincide con un texto de mensaje predefinido.

try: 
     import pypatred 
    except RuntimeError,e: 
     if e.message == 'RuntimeError: pyparted requires root access': 
      return 'pyparted - no root access' 
     raise 

Por supuesto, la comparación directa de texto es sólo un ejemplo, usted podría buscar subcadenas incluidos o expresiones regulares.

Vale la pena señalar que el atributo .message de excepciones es . Puede encontrar el texto en .args, generalmente args[0].

... For 2.6, the message attribute is being deprecated in favor of the args attribute.

+1

y tendrá que cambiar esto cada vez que los desarrolladores cambien una letra en el mensaje de error. – SilentGhost

+3

¡Esto es malo!no debería comparar un mensaje de error como ese a menos que sea absolutamente inevitable. –

+0

Desafortunadamente, en este caso, parece que comparar el mensaje de error * es * inevitable: pyparted no parece generar un error más específico. –

0

RuntimeError Se genera cuando se detecta un error que no cae en ninguna de las otras categorías

def foo(): 
    try: 
     foo() 
    except RuntimeError, e: 
     print e 
     print " Runtime Error occurred due to exceeded maximum recursion depth " 

Así es como vamos a coger el RuntimeError causada por el límite de recursividad superado en Python

Y si usted quiere llamar a su función sobre el límite de recursividad se puede hacer lo siguiente

import sys 
def foo(): 
    try: 
     foo() 
    except RuntimeError, e: 
     sys.setrecursionlimit(1200) 
     foo() 

Pero siempre altamente no es reco Modificado para cambiar el límite de recursión, pero se permiten cambios muy pequeños en el límite de recursión

Cuestiones relacionadas