说我有一个方法:
public void SomeMethod(String p1, String p2, int p3)
{
#if DEBUG
object[] args = GetArguments();
LogParamaters(args);
#endif
// Do Normal stuff in the method
}
Run Code Online (Sandbox Code Playgroud)
有没有办法检索传递给方法的参数数组,以便记录它们?
我有大量的方法,并希望避免手动将名称传递给记录器,因为人为错误将不可避免地蔓延.
我猜它会以某种形式涉及反射 - 这很好,因为它只会用于调试目的.
更新
更多信息:
我无法更改SomeMethod的方法签名,因为它作为WebMethod公开,并且必须复制它模拟的遗留系统.
遗留系统已经记录了传入的参数.从新实现开始将包装遗留系统,所以我希望记录进入C#版本的参数,以便我可以验证正确的参数是否传入按正确的顺序.
我只是想记录参数值和顺序,而不是它们的名字.
我想得到一个关于我的堆栈跟踪的详细日志.我可以获得一个StackFrame,然后获取该方法,然后获取该方法的所有参数.就像下面的代码一样:
StackTrace st = new StackTrace();
StackFrame[] sfs = st.GetFrames();
foreach (StackFrame sf in sfs)
{
MethodBase method = sf.GetMethod();
ParameterInfo[] pis = method.GetParameters();
foreach (ParameterInfo pi in pis)
{
....
}
Console.WriteLine(method.Name);
}
Run Code Online (Sandbox Code Playgroud)
但是如何在方法中获取局部变量信息呢?
有人会对我有所了解吗?
非常感谢.
我正在编写一个错误处理模块,用于构建到层中的相当复杂的系统.有时我们的数据层会引发模糊的异常.
注销抛出异常的方法的参数值非常方便.
我可以反思异常的TargetSite属性来查找方法的参数类型和名称,但我似乎无法获取值...我错过了什么?
欺骗
我维护一个应用程序,当应用程序发生错误时,它会向我发送一封电子邮件.我将堆栈跟踪转储到电子邮件中,似乎工作正常.唯一缺少的是变量的值.我得到了所有的调用等等,从来没有任何变量.为了将这些变量值转储到电子邮件中,我还缺少什么?
下面是我用来将其转储到电子邮件中的代码:
UtilityClass.SendEmail(shortNTID,
"admin@mydomain.com",
new string[] { "support@mydomain.com" },
"MyApplication error has occured for user: " +
shortNTID + " (Main).",
"Message: " + ex.Message.ToString() +
" Source: " + ex.Source.ToString() +
" Target Site: " + ex.TargetSite.ToString() +
" Stack Trace: " + ex.StackTrace.ToString());
Run Code Online (Sandbox Code Playgroud)
以下是电子邮件中的结果:
消息:指定的强制转换无效.来源:MyApplication目标站点:Void FindFormAndActivate(MyApplication.MDIParentForm,System.String,System.Object)堆栈跟踪:MyApplication.DtilityClass.FindFormAndActivate(MDIParentForm frmMDIParentForm,String formName,Object参数)MyApplication.DashboardAlerts.NavigateToAssignment()at MyApplication System.Windows上System.Windows.Forms.Control.WmMouseUp(Message&m,MouseButtons按钮,Int32单击)的System.Windows.Forms.Control.OnMouseClick(MouseEventArgs e)中的.DashboardAlerts.utAlerts_MouseClick(Object sender,MouseEventArgs e).在System.Windows.Fornd.NativeWindow的System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m)的System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)中的Forms.Control.WndProc(Message&m).回调(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)
编辑
有些答案建议我自己将变量值添加到电子邮件中.我怎么会得到这些价值呢?发送电子邮件的此代码段不在失败的方法中.这是在发生异常时运行的代码.如果没有处理和纠正异常,我会让它冒泡到线程的顶部,Application.ThreadException += new ThreadExceptionEventHandler(HandleError);并且该HandleError方法是进行此电子邮件调用的方法.它不知道导致异常的方法的变量或参数是什么.
我正在为csv文件编写解析器,有时我会得到NumberFormatException.是否有一种简单的方法来打印导致异常的参数值?
目前我有很多看起来像这样的try-catch块:
String ean;
String price;
try {
builder.ean(Long.parseLong(ean));
} catch (NumberFormatException e) {
System.out.println("EAN: " + ean);
e.printStackTrace();
}
try {
builder.price(new BigDecimal(price));
} catch (NumberFormatException e) {
System.out.println("Price: " + price);
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我希望能够写出如下内容:
try {
builder.ean(Long.parseLong(ean));
} catch (NumberFormatException e) {
e.printMethod(); // Long.parseLong()
e.printArgument(); // should print the string ean "99013241.23"
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
有什么方法我至少可以改进我的代码吗?以编程方式更多地进行这种打印/记录?
更新:我试图实施Joachim Sauer所回答的问题,但我不知道我是否把一切都做对了,或者我是否可以改进它.请给我一些反馈.这是我的代码:
public class TrackException extends NumberFormatException {
private final String arg;
private final String method;
public …Run Code Online (Sandbox Code Playgroud)