2009-07-02 18 views
9

En el controlador, intente ... la captura puede detectar excepciones. ¿Cómo atrapar la excepción a la vista? por ejemplo, una vista puede tener un código como:cómo detectar la excepción de la vista MVC?

<%= Html.Encode(Model.MyID)%> 

Si Modelo es nulo, obtendrá una excepción cuando el acceso de la vista. dónde atrapar la excepción y redirigir al usuario a una página de error con un mensaje de error fácil de usar?

+0

¿Qué tecnología estás usando? –

+0

MS ASP.NET MVC framework – KentZhou

+1

No utilizaría excepciones para un comportamiento no excepcional y definitivamente no en la vista. – Paco

Respuesta

1

Esta lógica debe manejarse dentro de su Controlador y no en la Vista. Por ejemplo, si está intentando ver un Producto con MyID que no existe, redireccione a una página de error.

Si se ha producido un error, también podría redirigir a una vista InvalidProduct que proporcionaría una descripción/instrucciones de error más detalladas.

Editar: Además de los comentarios de personas a continuación para ver las excepciones no controladas, agregue el atributo [HandleError] en su declaración de método ActionResult o en el controlador (para todos los resultados de acción).

[HandleError] 
public ProductsController 
{ 
    public ActionResult Show(int id) 
    { 
     Product p = //e.g. get product from db 

     if (p == null) 
     { 
      return RedirectToAction("Error"); 
      //return RedirectToAction("InvalidProduct"); 
     } 

     return View(p); 
    } 
+1

¿Qué pasa si hay una excepción/error que usted no sabe acerca? –

+2

Su aplicación debe "fallar rápido". No puede manejar una excepción que no conoce de todos modos. – jlembke

+1

Esta no es una respuesta a la pregunta del OP. Por supuesto, es mejor tener este tipo de lógica en el controlador, pero todavía no es una respuesta. Estoy trabajando en un prototipo in situ en un cliente, donde se tardan unos 15 minutos en cargar archivos. Las vistas se pueden editar en el Bloc de notas, pero para editar el controlador, tengo que volver a compilar en mi máquina y subir los binarios. Así que estoy usando las Vistas para probar cosas. Pero no puedo ver las excepciones, ya que están ocultas por algún proxy entre el servidor y yo, y no aparecen en los registros. Todavía en busca de una solución. – cheeesus

1

Bueno, no siempre se puede capturar cada error en el controlador, pero esperemos que sus puntos de vista debe ser ligero lo suficientemente donde es muy poco probable que suceda.

Sin embargo, si se lanza una excepción en la vista, debe tener configurada una página de error 500 personalizada para redirigir al usuario por si acaso. Creo que puede configurar un redireccionamiento como este en Global.asax o también podría ser una configuración de IIS.

4

Simplemente agregue el atributo [HandleError] a la parte superior de su clase de controlador. De esta forma, se manejará cualquier excepción generada por su Controlador y se le presentará al usuario /Views/Shared/Error.aspx. El modelo pasado a esa vista es un objeto System.Web.Mvc.HandleErrorInfo.

El controlador:

[HandleError] 
public class MyController : Controller 
{ 
    public ActionResult Default() 
    { 
    MyClass thing = MyClassFactory.Create(); 
    return View(thing); 
    } 
} 

Ésta es una de "último recurso" manejo de excepciones. La respuesta de David es mejor para los casos que se te ocurran con anticipación.

2

Aunque apoyo la respuesta de David Liddle ("Esta lógica debe ser manejado dentro de su controlador y no la vista") También puedo decir que usted debe codificación defensiva en general.

Por ejemplo en lugar de

try 
{ 
    Html.Encode(Model.MyID) 
} 
catch 
{ 
    Response.Redirect("~/Error/500"); 
} 

debe

if (Model == null) 
{ 
    // ... 
} 
else 
{ 
    //..... 
} 

(por supuesto, de nuevo, no ponga la vista lógica de selección en una vista)

+1

¿Tengo que agregar '@' antes de 'if' y' else'? –

0

Puede usar try/catch en un bloque de script en la vista:

@try 
{  
    <div>typical Razor view stuff here...</div> 
} 
catch (Exception ex) 
{ 
    @<script type="text/javascript"> 
    alert('@ex.Message.Replace("'","\\'").Replace("\r\n","<br/>")'); 
    </script> 
} 
0

Estoy de acuerdo con Matthew Groves en que no siempre se puede detectar cada error. Desafortunadamente en mi caso, tengo una opinión que tiene 100 variables algo. Es difícil dar cuenta de todos ellos.

Hay una variedad de formas de atrapar errores aquí: http://www.codeproject.com/Articles/850062/Exception-handling-in-ASP-NET-MVC-methods-explaine

En mi caso, yo quería grabar el error que se ha producido en la vista con los datos que se utilizó en el controlador. Así que elegí anular OnException en mi controlador. De esta manera, durante la acción, puedo almacenar mis datos en la instancia del controlador y luego acceder a ellos más tarde en el método OnException.

Cuestiones relacionadas