我想得到导致错误的代码行数.例如;
static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection(bagcum))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "DONTINSERT into GIVEMEERROR(CamNo,Statu) values (" + 23 + "," + 0 + ")";
conn.Open();
int n = cmd.ExecuteNonQuery();
}
}
Run Code Online (Sandbox Code Playgroud)
所以我们知道代码不起作用,它会抛出异常行代码,它是:
int n = cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
那么如何获得使用的行数try-catch?我尝试使用StackTrace类,但它将行号设为0:
static void Main(string[] args)
{
try
{
using (SqlConnection conn = new SqlConnection(bagcum))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "DONTINSERT into GIVEMEERROR(CamNo,Statu) values (" + 23 + "," + 0 + ")";
conn.Open();
int n = cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
}
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
Line:0
Run Code Online (Sandbox Code Playgroud)
更新:
通常错误代码行是22,所以我必须得到这个数字.
谢谢
小智 21
试试这个简单的黑客:
首先将此(扩展)类添加到命名空间(大多数是顶级类):
public static class ExceptionHelper
{
public static int LineNumber(this Exception e)
{
int linenum = 0;
try
{
//linenum = Convert.ToInt32(e.StackTrace.Substring(e.StackTrace.LastIndexOf(":line") + 5));
//For Localized Visual Studio ... In other languages stack trace doesn't end with ":Line 12"
linenum = Convert.ToInt32(e.StackTrace.Substring(e.StackTrace.LastIndexOf(' ')));
}
catch
{
//Stack trace is not available!
}
return linenum;
}
}
Run Code Online (Sandbox Code Playgroud)
并完成了!在需要时使用LineNumber方法:
try
{
//Do your code here
}
catch (Exception e)
{
int linenum = e.LineNumber();
}
Run Code Online (Sandbox Code Playgroud)
试试这个
要获取StackTrace中的行号,您需要在dll/exes旁边拥有正确的调试信息(PDB文件).要生成调试信息,请在Project Properties -> Build -> Advanced -> Debug Info以下位置设置选项:

将其设置为full足够(请参阅MSDN文档了解其他选项的用途).默认情况下会为Debug构建配置生成调试信息(即PDB文件),但也可以为Release构建配置生成调试信息(即PDB文件).
为发布版本生成PDB使您可以在没有PDB的情况下发送代码,但是如果需要行号(或者甚至连接远程调试器),则将PDB放在dll旁边.需要注意的一点是,在发布版本中,由于编译器或JIT编译器的优化,行号可能不完全正确(如果行号显示为0,则尤其如此).
问题是您正在尝试获取异常的第一帧的行号:
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
Run Code Online (Sandbox Code Playgroud)
但是,异常不是源于您编写的行ExecuteNonQuery,而是源于该函数中的某个位置,可能是多个堆栈帧(即嵌套函数调用)更深.因此,第一个框架(您明确检索使用的GetFrame(0))是Microsoft的代码(最有可能System.Data.dll)内部,您没有任何调试符号.
在函数中写出完整的异常堆栈跟踪,看看我的意思:
try
{
// your code ...
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Run Code Online (Sandbox Code Playgroud)
如果没有解析堆栈跟踪(即ex.StackTrace),那么为什么不能获得"ExecuteNonQuery()"调用的整数.我特别不会尝试将堆栈帧计数到您调用ExecuteNonQuery()的堆栈中.
我想知道,你需要什么样的唯一亚麻,为什么不只是记录/打印/任何完整的堆栈跟踪.至少出于诊断原因,无论如何都更有用.
如果不初始化StackTrace包含fileinfo,结果可能为0。

尝试这个
try
{
//code
}
catch (Exception e)
{
var lineNumber = new System.Diagnostics.StackTrace(e, true).GetFrame(0).GetFileLineNumber();
}
Run Code Online (Sandbox Code Playgroud)
这对我有用。
| 归档时间: |
|
| 查看次数: |
66218 次 |
| 最近记录: |