我试图在.net(c#)中添加一个未处理的异常处理程序,该处理程序对于'user'应该尽可能有用.最终用户大多是程序员,所以他们只需要暗示他们操纵错误的对象.
当应用程序崩溃时,我正在开发类似于Windows XP错误报告的窗口,但是尽可能多地提供关于抛出的异常的中间信息.
虽然堆栈跟踪使我(因为我有源代码)能够查明问题的根源,但是用户没有它,因此它们在没有进一步信息的情况下丢失.不用说我必须花很多时间来支持这个工具.
有一些系统异常,如Dictionary集合抛出的KeyNotFoundException,它真的让我感到烦恼,因为它们没有在消息中包含未找到的密钥.我可以使用大量的try catch块来填充我的代码,但它相当激进并且需要维护更多的代码,更不用说更多的字符串必须最终被本地化.
最后一个问题:有没有办法获得(在运行时)调用堆栈跟踪中每个函数的参数值?仅这一点就可以解决90%的支持电话.
如果我有一个方法如:
public void MyMethod(int arg1, string arg2)
Run Code Online (Sandbox Code Playgroud)
我如何获得参数的实际名称?我似乎无法在MethodInfo中找到任何实际上会给我参数名称的内容.
我想写一个看起来像这样的方法:
public static string GetParamName(MethodInfo method, int index)
Run Code Online (Sandbox Code Playgroud)
所以如果我用以下方法调用此方法:
string name = GetParamName(MyMethod, 0)
Run Code Online (Sandbox Code Playgroud)
它将返回"arg1".这可能吗?
可以枚举被调用的方法参数类型/信息,如下所示:
private void SomeMethod(int thisValue, string thatValue)
{
StackTrace stackTrace = new StackTrace();
foreach (ParameterInfo pInfo in stackTrace.GetFrame(0).GetMethod().GetParameters())
{
string name = pInfo.Name;
string type = pInfo.GetType().ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
但有没有办法得到每个参数的实际对象?
编辑:我的目标是枚举所有参数并获取它们的值.使用LinQ表达式,可以获得如下参数值:
private void SomeMethod(int thisValue, string thatValue)
{
object valueOfThis = GetParameterValue(() => thisValue);
object valueOfThat = GetParameterValue(() => thatValue);
}
private object GetParameterValue<T>(Expression<Func<T>> expr)
{
var body = ((MemberExpression)expr.Body);
return ((FieldInfo)body.Member).GetValue(((ConstantExpression)body.Expression).Value);
}
Run Code Online (Sandbox Code Playgroud)
但我想做的是:
foreach (fooObject o in thisMethod.GetParameterObjects())
{
object someValue = GetParameterValue(() => fooObject);
}
Run Code Online (Sandbox Code Playgroud)
因此,有一个通用的方法来收集所有参数及其值.