2010-05-18 19 views
21

Tengo un par de bibliotecas que usan Debug.Assert(...). Creo que el Debug.Assert(...) está bien y todavía quiero que se ejecuten, pero no quiero que bloqueen la ejecución de mi aplicación. Idealmente, solo me gustaría que estén registrados en alguna parte.Cómo evitar que Debug.Assert (...) muestre un cuadro de diálogo modal

Dado que no puedo cambiar el código de las bibliotecas (y que todavía quiero compilar en la depuración y ejecutar la aserción), ¿cómo evito que Debug.Assert(...) muestre un cuadro de diálogo modal?

Además, me gustaría asegurarme de que el programa principal continúe cuando ocurra un Assert (el mismo comportamiento que el botón Ignorar).

Gracias!

+0

divertido nadie ha mencionado aquí, pero 'Debug.Assert()' no termina en su compilado aplicación (cuando lo despliega en modo Release). Esta es estrictamente una herramienta de depuración y no afectará a los usuarios finales. Pero como se mencionó, si no arregla las afirmaciones, pueden ocurrir cosas malas en su aplicación. – NightOwl888

Respuesta

23

No lo recomendaría. El problema es que Debug.Assert solo se debe disparar cuando tiene errores en su código. Si los ignoras o no los solucionas, estás haciendo un flaco servicio a tus usuarios. Si, por otro lado, está disparando Debug.Assert por cosas que no son errores, entonces también está haciendo un flaco servicio a sus usuarios (al reducir el impacto de Debug.Assert).

Habiendo dicho eso, usted puede deshabilitarlo. Lo primero que hay que hacer es quitar la escucha predeterminado del Debug.Listeners colección:

Debug.Listeners.Clear(); 

A continuación, añadir su lugar:

Debug.Listeners.Add(new MyTraceListener()); 

Es necesario crear una clase que hereda de TraceListener:

class MyTraceListener : TraceListener 
{ 
    // ... 

    public override void Fail(string msg, string detailedMsg) 
    { 
     // log the message (don't display a MessageBox) 
    } 
} 

el método importante es el método TraceListener.Fail, que en la ejecución de DefaultTraceListener es lo que muestra el cuadro de mensaje.

+0

Esto funciona perfectamente, pero cuando falla una afirmación, el código no se ejecuta. Quiero que continúe ¿Alguna idea de cómo puedo hacer eso? – Martin

+1

+1 muy bien explicado. –

+2

@Martin El objetivo de las aseveraciones es disparar cuando haya errores. Si una aseveración se dispara, se supone que la ejecución se detiene porque el resultado no es predecible.Intentas abusar de las afirmaciones y debes apegarte a tu propio registrador. –

5

La respuesta de Codekas es correcta, si quieres golpear las cosas con un martillo muy grande. Puede usar el elemento <assert> en su archivo de configuración de la aplicación para establecer la propiedad assertuienabled en falso y, opcionalmente, dar un archivo de registro para que se escriba en Asserts. Entonces no tendrás que escribir tu propio oyente.

Puede leer más sobre el elemento assert en su MSDN page.

+0

Esto funciona perfectamente, pero cuando falla una afirmación, el código no continúa ejecutándose. Quiero que continúe ¿Alguna idea de cómo puedo hacer eso? – Martin

+0

@Martin Bastante viejo tema aquí, pero ¿por qué quieres continuar, si tienes errores en tu código? Quiero decir, ¿cuál es tu expectativa de un resultado erróneo, porque cualquiera de tus suposiciones es falsa? –

11

No hay necesidad de Debug.Listeners.Clear()

Sólo tiene que añadir a su .config:

<system.diagnostics> 
    <assert assertuienabled="false"/> 
</system.diagnostics> 
Cuestiones relacionadas