6

Si añado la siguiente línea a un método de acción ASP.NET MVCLanzar Excepción con SecurityException interior sólo muestra la excepción interna en ASP.NET MVC

throw new Exception("outer", new SecurityException("inner")); 

el error que se muestra realmente en la pantalla amarilla de la muerte es la SecurityException interna sin ninguna mención de la excepción externa.

SecurityException

Description: The application attempted to perform an operation not allowed by the security policy. To grant this application the required permission please contact your system administrator or change the application's trust level in the configuration file.

Exception Details: System.Security.SecurityException: inner

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[SecurityException: inner]

¿Este comportamiento es esperado?

Parece que no importa de qué tipo es la excepción externa. Incluso si se trata de otra SecurityException, el mensaje nunca se muestra. El mensaje de error SecurityException predeterminado es tan vago que quiero verlo y agregar información más específica. Esto funciona bien si no incluyo la SecurityException original como innerException pero, idealmente, me gustaría hacer esto.

+0

Estoy viendo que esto es cierto para cualquier excepción interna, no solo para la excepción de seguridad. –

Respuesta

-1

en general que debiera clase de excepciones Nunca arroje/oponerse directamente, sino sólo los derivados, por ejemplo:

throw new SecurityException("user should not be allowed to access this method..."); 

en una situación como esta lo que le falta en el registro o en la página?

si utiliza un controlador de excepción global de aplicación y registra desde allí con Log4Net o NLog debe poder acceder a todas las cadenas de excepción de exterior a interno y demás, dependiendo de cómo configure y utilice el marco de registro. La página amarilla de IIS/ASP.NET podría no estar completa, pero debería mostrar la traza de todos modos.

si desea lanzar su propia excepción de un bloque catch que se coloca la excepción real procedente de la captura de esta manera:

throw new SecurityException("user should not be allowed...", exc); 

Editar: intentaron lo que usted sugiere y salía esta conectado un archivo de texto log4net:

System.Security.SecurityException: more explicit exception ---> System.Security.SecurityException: original exception at EDICheckerApp.Program.boom() in C:\DEV_RPP\Program.cs:line 45
--- End of inner exception stack trace --- at EDICheckerApp.Program.boom() in C:\DEV_RPP\Program.cs:line 49
at EDICheckerApp.Program.Main(String[] args) in C:\DEV_RPP\Program.cs:line 27

+1

intente esto y comprenderá lo que estoy diciendo: intente { throw new SecurityException ("excepción original"); } catch (SecurityException ex) { throw new SecurityException ("excepción más explícita", ej.); } –

+0

sí Entiendo, pero trate de volcar todo con un marco de trabajo de registro, ¿qué obtiene en el archivo de registro? –

+1

En este caso, el mensaje es principalmente para desarrolladores.Quiero que se genere el mensaje de error amigable para que los desarrolladores lo vean en el momento de la depuración, no para el registro, y así obtienen un mensaje fácil de entender en lugar de críptico. –

5

Este comportamiento se origina en el "núcleo" ASP.NET, no en ASP.NET MVC. Desafortunadamente, las clases del formateador de errores son internas, y los tipos consumidores no proporcionan ningún punto de extensión que permita modificar el comportamiento sin reemplazar el mecanismo de informe de errores. La solución consiste en reemplazar la página predeterminada "pantalla amarilla de la muerte" por una página/vista de error personalizada en la que se expone la información que uno prefiere.

Esto es exactamente lo que uno normalmente debería estar haciendo para la producción. En su caso, solo significa que tendrá una versión alternativa para la depuración en lugar de utilizar el valor predeterminado proporcionado por ASP.NET.

Cuestiones relacionadas