Capturar segfault con try/catch en C++

Iniciado por geeke, 21 Octubre 2016, 01:05 AM

0 Miembros y 1 Visitante están viendo este tema.

geeke

 Este hilo lo creo a modo de aclaracion en referencia a otro hilo donde se discutio el mismo tema, en el cual el moderador de turno brindo información no del todo acertada, luego de manera arbitraria procedio a bloquear el hilo sin razon alguna. Lo cual me parecio injusto, ya que cerro la posibilidad de que otro usuario pueda opinar al respecto.

 En lo referente al tema, C++ dispone de una lista de excepciones establecidas que son lanzadas por throw producto de algun error, hay que dejar en claro que try/catch solo puede capturar excepciones lanzadas por throw, por tanto obviamente un segfault, division por cero no son inherentes al C++ estandar, es una situacion que se produce de manera inesperada a nivel hardware, por lo tanto ya es dependiente de cada OS y compilador la manera controlarlos.

Mas info: http://stackoverflow.com/questions/1823721/how-to-catch-the-null-pointer-exception

Otra cosa es usar alguna extension del compilador para interpretar un segfault como una excepcion de C++ estandar (lo cual no es nada portable) como es el caso de Visual C++:

CitarException Handling Model

You can set an exception handling model for your Visual C++ compiler with /EHs (or EHsc) to specify synchronous exception handling model, or /EHa to specify asynchronous exception handling model. The asynchronous model can be used to force the try{}catch(){} construction to catch both SEH and C++ typed exceptions (the same effect can be achieved with the _set_se_translator() function). If a synchronous model is utilized, SEH exceptions are not caught by the try{}catch(){} construction. Asynchronous model was the default in previous versions of Visual C++, but the synchronous one is the default in the newer versions.

Mas info: http://www.codeproject.com/Articles/207464/Exception-Handling-in-Visual-Cplusplus

https://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.80).aspx

 





Eternal Idol

Cita de: geeke en 19 Octubre 2016, 22:44 PM
No puedes usar los bloques try/catch para capturar un segmentation fault, porque no es una excepción mas bien es una señal que el sistema operativo envía como consecuencia al intentar acceder en alguna zona de memoria no permitida. Además no veo razón para hacer esto, porque continuar el programa después no es posible se invocaría comportamiento indefinido y esto no es nada seguro.

Este hilo no aclara ni aporta nada que se no haya dicho, ni que no se pudiera encontrar en Google con 5 minutos de busqueda en base a lo ya dicho, en el hilo bloqueado.

PD. La proxima vez no abras otro hilo cuando hay uno ya bloqueado sobre el tema, si estas tan desperado por escribir algo me mandas un mensaje y te desbloqueo el hilo, gracias.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón