我可以获得导致异常的代码行吗?

时间:2009-05-02 18:59:16

标签: c# exception-handling

除了阅读GetFileName()文件并从

读取到堆栈框架的GetFileLineNumber()行之外
new StackTrace(exception).GetFrame(x)

有没有办法获得导致异常的实际代码行(作为字符串)?

由于

6 个答案:

答案 0 :(得分:2)

我不这么认为。代码已编译,因此不再可用。 但是,如果您拥有可用的源代码,则可能会有一些解决方法。

答案 1 :(得分:1)

不,就我所知,这是你唯一的选择。为了获得导致异常的原始代码行,必须使源可用。 StackFrame已经使你能够获得行号(通过调试符号 - 在大多数情况下是PDB文件),这使得它很简单,我会说。

您建议的方法是否有任何特殊问题?

答案 2 :(得分:1)

没有可行的方法,因为行信息不存储在DLL文件中。将IL块映射到源代码行的信息存储在PDB文件中。您需要访问PDB才能获取异常的行信息。

如果PDB可用,StackFrame类上有足够的信息来获取适当的ISymUnmanagedMethod类。主要是你只需要方法标记和方法中的当前偏移量。这确实需要您了解PDB的内部结构,我不确定它是否记录在任何地方。

PDB API:http://msdn.microsoft.com/en-us/library/ms233503.aspx

答案 3 :(得分:1)

它会被编译,所以在运行时你只有IL。充其量,你可以获得IL并将其反编译回C#,就像反射器一样。

答案 4 :(得分:0)

发布moretem调试很困难,但并非不可能。您可以使用工具(例如herehere)以及techniques

答案 5 :(得分:0)

您可以使用$query3 = "INSERT INTO inventory (item_name, item_code, item_cat, supplier, item_location, quantity, init_price, buy_price, item_sold, date_now) VALUES (:item_name, concat(:item_name, :quantity), :item_cat, :supplier, :item_location, :quantity, :init_price, :buy_price, :item_sold, :date)"; 块获取行:

try catch