2010-03-10 14 views
5

Copie y pegue lo siguiente en una nueva aplicación de consola en VS. Agregue referencias a System.Web y System.Web.Services (sé que las aplicaciones de consola no necesitan estos ensamblajes, solo le muestro un fragmento de código que no funciona en mi aplicación web)..net: depurador que resalta la línea de código que en realidad no se está ejecutando

Aunque ambas condiciones en la sentencia if son falsas, se está convirtiendo en verdadera. Alguien sabe la razón por qué? (Visual Studio 2008 9.0.30729.1) .NET 3.5 SP1

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web.Services; 
using System.Web; 

namespace ConsoleApplication8 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string x = "qweqweqw"; 
      string y = 
       "{\"textMedia\":[-1,-1,-1,-1,-1],\"textOperand\":[1,1,1,1,1],\"textString\":[\"\",\"\",\"\",\"\",\"\"],\"dateSite\":[-11],\"dateOperand\":[],\"dateString\":[],\"status\":[-11,0,0],\"media\":[-11,0,0],\"subItem\":true,\"context\":false,\"branchSearch\":false,\"profileIDs\":[2,5,18],\"profileViewIDs\":[48,58,38],\"currentSelectedBranch\":0}"; 

      SaveSearch(x, y); 
     } 

     [WebMethod] 
     public static object SaveSearch(string name, string encodedSearch) 
     { 
      object response = new { }; 

      string x = name; 
      string y = encodedSearch; 

      // Why does this if statement throw an exception if both equal false? 
      if (x.Trim().Equals(string.Empty) || y.Trim().Equals(string.Empty)) 
       throw new AjaxErrorException("Save Search", "Something went wrong", "JSFunction"); 


      try 
      { 
       { 
        return new 
        { 
         error = false, 
         name = name, 
         userID = 123, 
         date = DateTime.Now 
        }; 
       } 
      } 
      catch (Exception ex) 
      { 
       String e; 

       if (HttpContext.Current.IsDebuggingEnabled) 
        e = ex.Message + "\n\n" + ex.StackTrace; 
       else 
        e = "error error aliens approaching"; 

       throw new AjaxErrorException("Save Search", e, ""); 
      } 

      return response; 
     } 

     public class AjaxErrorException : System.Exception 
     { 
      public AjaxErrorException(string title, string details, string function) 
       : base(title) 
      { } 
      string _stackTrace; 
      public override string StackTrace 
      { 
       get 
       { 
        return _stackTrace; 
       } 
      } 
     } 
    } 
} 
+0

Pase por un depurador para ver qué está pasando realmente. –

+0

¿Probaste mi código? –

+2

¿Alguna vez intentó depurar? –

Respuesta

8

Realmente compruebo y, aunque el depurador entra en la instrucción que sigue al if (instrucción throw), en realidad no arroja la excepción. Sospecho que es la incoherencia entre IDE, IL generated y Debugger particularmente para throw statement. Si intenta otro tipo de declaración, realmente no ve el problema. Parece estar relacionado con esta publicación también If statement weirdness in Visual Studio 2008

Inserté la declaración assert dentro del bloque if como se muestra a continuación para garantizar que no se activó ninguna aserción.

System.Diagnostics.Debug.Assert(false); 
+0

Gracias por una explicación. Finalmente :-) –

+1

@Psycho -Welcome. En realidad, es un hallazgo interesante y también me intrigaba –

-1

el ONE/dos variables de cadena son probablemente nula, no está vacío.

EDIT ¿Por qué ustedes votaron hacia abajo? Supongo que su declaración arroja NullReferenceException.

De todos modos, tal vez mi respuesta no era lo suficientemente claro :(

+1

Si ese fuera el caso, el Trim() se habría lanzado. – chrissr

+0

Si fueran nulos, obtendría una excepción de referencia nula. –

+0

@chrissr, @Otavio - Tienes razón, pero supongo que tiene una excepción de referencia nula. Dijo que "se está convirtiendo en realidad", por lo que cree que es cierto, ya que espera lanzar su AjaxErrorException, pero no funciona. – Novitzky

0

nulo no es el mismo que el vacío. Así null.Equals(string.Empty) vuelve falsa. Pero null.Trim() lanza una excepción de referencia nula, y por lo que necesita para probar nulo en este código primero. string.IsNullOrEmpty(), como lo sugiere @Otavio, es la forma correcta de hacerlo. No olvide recortar la cadena después de verificar que, dado que obviamente también le preocupan las cadenas de solo espacio.

I sepa que no lo ayuda en este momento, pero .Net 4 tendrá un método incorporado que realiza el ajuste, la comprobación nula y la comprobación vacía todo en el mismo método.


Esto debería hacer lo que tiene:

if (string.IsNullOrEmpty(x) || string.IsNullOrEmtpy(y) || x.Trim().Length == 0 || y.Trim().Length == 0) 
+0

Probé string.IsNullOrEmpty y esto tampoco funciona. –

+1

@Sir Psycho: todavía tiene que recortar la cadena _si_ pasa la comprobación nula. –

+0

Recorté() las cadenas y usé IsNullOrEmpty() y esto todavía no funciona. –

0

Acabo de intentar esto:

string x = " text \t\t\n"; 
    string y = "not empty"; 

    if (x.Trim().Equals(string.Empty) || y.Trim().Equals(string.Empty)) 
     Console.WriteLine("TRUE"); 

Y es que no se imprimió 'verdadero' como se esperaba. Debe haber alguna otra falla o tal vez en su código real, ¿tiene un punto y coma después de la declaración 'si'?

Editar: Con la excepción throw en lugar de writeline, tampoco tira. ¿Estás seguro de que este es el código que está lanzando?

+1

Estoy confundido. ¿Por qué esperas que esto se imprima VERDADERO? Yo esperaría lo opuesto. –

+0

La redacción está desordenada, léala de la siguiente manera: "Y no se imprimió 'VERDADERO', como debería esperarse". Todo lo que está antes del punto y coma es lo que se espera en este caso. Maldición en internet. –

1

Así que intenté pegar este código exacto en una nueva aplicación de consola en vs2008 y agregué las referencias necesarias. Esto es lo que hizo por mí:

Al ejecutar la aplicación no parecía arrojar ninguna excepción. Sin embargo,, cuando lo ejecuté en el depurador y pasé por la línea 30 (la línea con if), el depurador resaltó la línea de la red (con el tiro) en amarillo. Pude seguir ignorando el código sin que se lanzara una excepción real.Si configuro un punto de interrupción en la línea 31 (la línea de lanzamiento) nunca se golpea.

Creo que la interfaz de usuario del depurador simplemente está apagada. En realidad, no parece estar ejecutando ese código. No sé qué causaría eso, pero no parece preocuparse por nada.

0

Esto debería solucionar el problema. Primero, elimine los contenidos de los directorios obj y bin en su proyecto. Luego reinicia tu computadora.

Si eso no soluciona el problema, es posible que deba volver a instalar Visual Studio.

+0

¿Y por qué se modificó? Fue una respuesta de buena fe con bastante buenas posibilidades de éxito. –

+0

Eso no soluciona nada, puede pegar este código en una nueva aplicación de consola (como ya lo dije) y obtendrá el mismo problema. –

Cuestiones relacionadas