如何使用try-catch获取代码的错误行数

Mus*_*ici 30 c# exception

我想得到导致错误的代码行数.例如;

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)


Eni*_*ate 9

试试这个

要获取StackTrace中的行号,您需要在dll/exes旁边拥有正确的调试信息(PDB文件).要生成调试信息,请在Project Properties -> Build -> Advanced -> Debug Info以下位置设置选项:

替代文字

将其设置为full足够(请参阅MSDN文档了解其他选项的用途).默认情况下会为Debug构建配置生成调试信息(即PDB文件),但也可以为Release构建配置生成调试信息(即PDB文件).

为发布版本生成PDB使您可以在没有PDB的情况下发送代码,但是如果需要行号(或者甚至连接远程调试器),则将PDB放在dll旁边.需要注意的一点是,在发布版本中,由于编译器或JIT编译器的优化,行号可能不完全正确(如果行号显示为0,则尤其如此).


Chr*_*n.K 7

问题是您正在尝试获取异常的第一帧的行号:

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()的堆栈中.

我想知道,你需要什么样的唯一亚麻,为什么不只是记录/打印/任何完整的堆栈跟踪.至少出于诊断原因,无论如何都更有用.


d-c*_*der 5

如果不初始化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)

这对我有用。