2016-02-16 8 views
7

Ho un piccolo problema con Visual Studio. Ho un metodo che genera un CustomExceptionLa finestra Visualizza dettagli non si espande Proprietà collezione

Se mi avvolgo il codice che chiama questo metodo in un try/catch posso vedere i dettagli di eccezione nel debugger

enter image description here

se mi tolgo la prova/catch posso vedere che la proprietà "errori" ha Count = 4, ma non riesco a vedere gli errori ...

enter image description here

è questo il previsto o è un bug?
Sto usando enterprise vs2015 e .NET 4.5.2

Si può facilmente riprodurre:
1) Creare una libreria di classi con questo

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ClassLibrary1 
{ 
    public static class Class1 
    { 
     public static void DoSomethingThatThrowsException() 
     { 
      throw new MyException(Enumerable.Range(1, 4).Select(e => new MyError() { Message = "error " + e.ToString() }).ToList()); 
     } 
    } 

    public class MyException : Exception 
    { 
     public IEnumerable<MyError> errors { get; set; } 
     public MyException(IEnumerable<MyError> theErrors) { errors = theErrors; } 
    } 
    public class MyError { public string Message { get; set; } } 
} 

2) Creare una console app con questo:

using ClassLibrary1; 

namespace ConsoleApplicationException 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       Class1.DoSomethingThatThrowsException(); 
      } 
      catch (MyException ex) 
      { 
       //Here I can expand ex.errors; 
      } 

      //Here I can see that Count=4 but I cannot see the errors... 
      Class1.DoSomethingThatThrowsException(); 

     } 
    } 
} 

PS
posso risolvere il mio problema con l'attributo "DebuggerDisplay", sto solo chiedendo perché Visual Studio non funziona come si aspettano Ed

[DebuggerDisplay("FullDetails = {FullDetails}")] 
public class MyException : Exception 
{ 
    public IEnumerable<MyError> errors { get; set; } 
    public MyException(IEnumerable<MyError> theErrors) { errors = theErrors;   } 
    public string FullDetails { get { return string.Join(",", errors.Select(e => e.Message)); } } 
} 

Aggiornamento
Se cambio il mio elenco di Array, ho lo stesso problema, ma se lo cambio al dizionario posso vedere il primo record !!!

+0

Forse la classe 'MyError' non è (contrassegnato come) serializzabile? –

+1

@UweKeim Ho lo stesso problema anche se lo contrassegno come serializzabile –

risposta

0

Questo funziona bene in Visual Studio 2017 ...

0

Suppongo che per qualche motivo il compilatore non possa valutare la query LINQ al momento del lancio. Prova a crearlo e poi a lanciarlo. Essa vi permetterà di calcolare la query LINQ prima di buttare:

public static void DoSomethingThatThrowsException() 
{ 
    var ex = new MyException(Enumerable.Range(1, 4) 
           .Select(e => new MyError() 
              { 
               Message = "error " + e.ToString() 
              }) 
           .ToList()); 
    throw ex; 
} 
+0

Questo è quello che pensavo all'inizio e ho provato la soluzione. Non funziona ... –

Problemi correlati