查看详细信息 window 不展开集合属性
View Detail window does not expand Collection properties
visual studio 我有一个小问题。
我有一个抛出 CustomException
的方法
如果我将调用此方法的代码包装在 try/catch 中,我可以在调试器中看到异常详细信息
如果我删除 try/catch 我可以看到 "errors" 属性 有 Count=4 但我看不到错误...
这是预期的还是错误?
我正在使用 vs2015 企业版和 .NET 4.5.2
您可以轻松复制它:
1)用这个
创建一个class库
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) 创建控制台应用程序:
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
我可以使用 "DebuggerDisplay" 属性解决我的问题,我只是想知道为什么 Visual Studio 没有按预期工作
[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)); } }
}
更新
如果我把我的列表改成数组,我有同样的问题,但是如果我把它改成字典,我可以看到第一条记录!!!
我想由于某种原因编译器无法在您抛出 LINQ 查询时对其求值。尝试创建它然后扔掉它。它将允许您在抛出之前计算 LINQ 查询:
public static void DoSomethingThatThrowsException()
{
var ex = new MyException(Enumerable.Range(1, 4)
.Select(e => new MyError()
{
Message = "error " + e.ToString()
})
.ToList());
throw ex;
}
这在 Visual Studio 2017 年工作正常...
visual studio 我有一个小问题。 我有一个抛出 CustomException
的方法如果我将调用此方法的代码包装在 try/catch 中,我可以在调试器中看到异常详细信息
如果我删除 try/catch 我可以看到 "errors" 属性 有 Count=4 但我看不到错误...
这是预期的还是错误?
我正在使用 vs2015 企业版和 .NET 4.5.2
您可以轻松复制它:
1)用这个
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) 创建控制台应用程序:
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
我可以使用 "DebuggerDisplay" 属性解决我的问题,我只是想知道为什么 Visual Studio 没有按预期工作
[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)); } }
}
更新
如果我把我的列表改成数组,我有同样的问题,但是如果我把它改成字典,我可以看到第一条记录!!!
我想由于某种原因编译器无法在您抛出 LINQ 查询时对其求值。尝试创建它然后扔掉它。它将允许您在抛出之前计算 LINQ 查询:
public static void DoSomethingThatThrowsException()
{
var ex = new MyException(Enumerable.Range(1, 4)
.Select(e => new MyError()
{
Message = "error " + e.ToString()
})
.ToList());
throw ex;
}
这在 Visual Studio 2017 年工作正常...