2010-01-29 10 views
9

Go doesn't provide assertions. They are undeniably convenient, but our experience has been that programmers use them as a crutch to avoid thinking about proper error handling and reporting.¿Cuál es la diferencia entre pánico y una afirmación?

Sin embargo, tiene print and println cual hace

de pánico como la impresión, aborta la ejecución después de la impresión
panicln como println, aborta la ejecución después de la impresión

¿No es que la lo mismo que una afirmación? ¿Por qué reclamarían lo anterior pero tienen pánico? Puedo ver que conduce a los mismos problemas pero agregando un mensaje de error al final del cual se puede abusar fácilmente. ¿Me estoy perdiendo de algo?

+3

No, no lo es. 'panic' es como" write then abort ", mientras que assert es como" test y si es falso, write then abort ". No hay manera de que puedan impedirte hacer una aseveración como asevera de todos modos. – zneak

+1

zneak: para mal tu comentario no hay una respuesta: D –

+1

Convertiré eso en una respuesta si es tan bueno. – zneak

Respuesta

16

No, no lo es. pánico es como "escribir y abortar", mientras que una afirmación es como "probar y si es falso, escribir y abortar". No hay manera de que puedan impedirte hacer una aseveración como asevera de todos modos.

1

Para uno, en C, assert() solo aborta la ejecución cuando está en modo de depuración.

+1

Sí, y ese es un comportamiento terriblemente incorrecto, tal vez el exacto que Google quiere evitar. ¿Por qué querrías dejar que tu programa continúe funcionando después de que se haya hecho algo mal? – zneak

+5

Para ser exactos, afirme la ejecución de cancelación a menos que se defina la macro del NDEBUG del preprocesador.Todavía es posible tener assert fuera de compilaciones de depuración si así lo desea. –

+2

Primero, "Google" no quiere nada aquí, solo algunas personas que trabajan en Google. En segundo lugar, no pueden evitar nada; sin afirmar en el lenguaje, la gente simplemente los dejará fuera de sus programas. No se trata de querer que su programa continúe después de hacer algo mal, es un tonto. Más bien, no quiere pagar el costo de hacer comprobaciones que siempre fallan en los programas correctos. Las afirmaciones son una forma de convertir programas incorrectos en programas correctos. –

2

Aparte de lo obvio, que panic no comprueba nada mientras assert lo hace, en Go puede usar mecanismos para el manejo de errores, incluso cuando se produce un pánico.

Si un paquete cree que ocurre algo que no se puede recuperar, entra en pánico.

Sin embargo, el usuario del paquete, el que llama (nivel principal) puede desear inspeccionar o registrar un pánico y luego seguir entrando en pánico, o atraparlo para manejarlo adecuadamente (por ejemplo, intente de nuevo o use un diferente paquete/función).

Además, un aborto de afirmación no llama destructores ni nada. Un pánico en Go though aún llamará incluso a las funciones que defer se ejecutarán, por lo que todo se limpia.

Por lo tanto, como puede ver, un pánico permitirá una variedad de tareas de limpieza en contraste con las aseveraciones. Eso es a lo que apuntaba la cita que diste.

Para obtener buena información sobre aplazamiento, pánico y recuperación, consulte the official blog post on them.

Cuestiones relacionadas