2011-08-25 8 views
29

Me pregunto Excepción ... He leído acerca Ir hace algún tiempo y he tratado de programar algo en ella. Me parece bastante interesante. Pero he llegado al handling "exceptions" in this language. He leído sobre su enfoque y parece razonable. Me gustaría saber cuáles son las ventajas del enfoque excepcional estándar sobre el estilo Go. ¿Cuáles son los pros y los contras?manejo en Google idioma ir

Editar Para ser sincero: no quiero hacer una guerra santa por las excepciones. Me pregunto si este estilo de manejo de errores tiene alguna ventaja. ¿Cuáles son las ventajas reales de este estilo sobre las excepciones estándar? ¿Vale la pena preguntarse en absoluto?

Respuesta

50

pánico/recuperarse es equivalente moral de excepciones try/catch. Existe una diferencia superficial (sintaxis) y una diferencia sutil, pero importante, del uso previsto.

La mejor explicación de los problemas con excepciones en general es "Cleaner, more elegant, wrong" y esa es una buena descripción de los pros/contras de las excepciones frente a los códigos de error de devolución.

diseñadores Go decidieron que el manejo de errores mediante la devolución de los códigos de error de las funciones es la forma Ir idiomática y el idioma compatible con múltiples valores de retorno para que sea sintácticamente fácil. Mientras se proporciona pánico/recuperación, la diferencia no es la funcionalidad sino el uso previsto.

Otros idiomas exponiendo excepciones fomentar el uso y en la práctica se utilizan con frecuencia (a veces incluso un mal uso).

Ir desalienta el uso de pánico/recuperarse. Puedes hacerlo, pero solo debes hacerlo en escenarios muy limitados.

Si mira la biblioteca estándar de Go, la mayoría de uses of panic son para señalar errores fatales, indicando un error interno (es decir, error) en el código de la biblioteca o llamando a la biblioteca con datos incorrectos (por ejemplo, pasando datos no-json a json decodificación de funciones).

Pero como señala el artículo que vinculó: "La convención en las bibliotecas Go es que incluso cuando un paquete utiliza el pánico internamente, su API externa aún presenta valores de retorno de error explícitos".

Esto es diferente de lenguajes como C#, Java, Python o C++, donde una gran cantidad de código de la biblioteca estándar puede lanzar excepciones para señalar errores. Esos idiomas quieren que uses excepciones. Go desalienta el uso de pánico/recuperación.

En resumen:

  • estilo idiomático Go es el uso de los códigos de error de decir la persona que llama acerca de los errores
  • uso de pánico/recuperar sólo en casos raros:
    • de "accidente" su programa cuando encuentre inconsistencias internas que indiquen errores en su código. Básicamente es una ayuda de depuración.
    • si se simplifica drásticamente la gestión de errores en el código (pero si el código es para ser utilizado por otros, nunca exponga tales pánicos a las personas que llaman)

En la práctica lo importante es utilizar de idiomática idioma estilo. En Go, devuelve los códigos de error y evita el pánico/recuperación. En C# que usa excepciones para señalar algunos de los errores.

+0

Gracias, esta es la respuesta que esperaba. – Archie

+0

Los autores de Go no desaconsejan el uso de pánico (al menos, ya no). Por ejemplo, Go wiki respalda explícitamente el uso de pánico a nivel de paquete para llamadas profundamente anidadas. https://code.google.com/p/go-wiki/wiki/PanicAndRecover#Usage_in_a_Package –