gpt4 book ai didi

c# - 获取 ASP.NET Core 中发生异常的行号

转载 作者:太空狗 更新时间:2023-10-29 20:42:28 24 4
gpt4 key购买 nike

我已经根据这篇博文 https://blog.kloud.com.au/2016/03/23/aspnet-core-tips-and-tricks-global-exception-handling/ 实现了自定义异常过滤器.

我现在注意到我无法从 StackFrame 中获取到发生异常的文件名或行号; GetFileLineNumber 方法的值始终为 0。

我尝试过的一个简单例子:

StackTrace trace = new StackTrace(exception, true);
StackFrame[] stackFrames = trace.GetFrames();
if (stackFrames != null) {
foreach (StackFrame traceFrame in stackFrames) {
sourceFile = traceFrame.GetFileName();
sourceLineNumber = traceFrame.GetFileLineNumber();
}
}

顺便提一下:GetFileName 也返回 null,但我可以从不同位置获取命名空间和类名,所以这不是问题。

在某处注意到我的文件夹中应该有 PDB 文件才能正常工作,我检查过我已经拥有它。即使它有效,它也应该适用于生产环境。

也尝试使用来电者信息 ( https://msdn.microsoft.com/en-us/library/mt653988.aspx ),但问题有点不同。异常过滤器必须实现 IExceptionFilter 接口(interface)并使用它的方法。因此我无法添加属性,即使它们是可选的。

这是 Startup.cs 中的代码部分:

public void ConfigureServices(IServiceCollection services) {
...
services.AddMvc(config => {
config.Filters.Add(new ApplicationExceptionFilter());
});
}

这是自定义过滤器

public class ApplicationExceptionFilter : IExceptionFilter {
public void OnException(ExceptionContext context) {
ApplicationExceptionHandler.handleException(context.HttpContext, context.Exception);
}
}

我尝试获取来电者信息的方法是:

public void OnException(ExceptionContext context,
[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0) {

但这将不起作用,因为它不再实现该接口(interface)。

如何获取行号,同时仍然在一个地方处理异常?


假设我的问题是我没有从堆栈跟踪中获取行号并重现了问题:

public ActionResult ServerError() {
Int32 x = 0;
try {
return Content((1 / x).ToString());
} catch (Exception ex) {
StackTrace trace = new StackTrace(ex, true);
StackFrame[] stackFrames = trace.GetFrames();
if (stackFrames != null) {
foreach (StackFrame traceFrame in stackFrames) {
String sourceFile = traceFrame.GetFileName();
int sourceLineNumber = traceFrame.GetFileLineNumber();
}
}
}
return Content("");
}

仍未获取 sourceFile(为空)或 sourceLineNumber(为 0)的值。

最佳答案

看看DeveloperErrorPageMiddleware implementation :

    private IEnumerable<ErrorDetails> GetErrorDetails(Exception ex)
{
for (var scan = ex; scan != null; scan = scan.InnerException)
{
var stackTrace = ex.StackTrace;
yield return new ErrorDetails
{
Error = scan,
StackFrames = StackTraceHelper.GetFrames(ex)
.Select(frame => GetStackFrame(frame.MethodDisplayInfo.ToString(), frame.FilePath, frame.LineNumber))
};
};
}

// make it internal to enable unit testing
internal StackFrame GetStackFrame(string method, string filePath, int lineNumber)
{
var stackFrame = new StackFrame
{
Function = method,
File = filePath,
Line = lineNumber
};

if (string.IsNullOrEmpty(stackFrame.File))
{
return stackFrame;
}

IEnumerable<string> lines = null;
if (File.Exists(stackFrame.File))
{
lines = File.ReadLines(stackFrame.File);
}
else
{
// Handle relative paths and embedded files
var fileInfo = _fileProvider.GetFileInfo(stackFrame.File);
if (fileInfo.Exists)
{
// ReadLines doesn't accept a stream. Use ReadLines as its more efficient
// relative to reading lines via stream reader
if (!string.IsNullOrEmpty(fileInfo.PhysicalPath))
{
lines = File.ReadLines(fileInfo.PhysicalPath);
}
else
{
lines = ReadLines(fileInfo);
}
}
}

if (lines != null)
{
ReadFrameContent(stackFrame, lines, stackFrame.Line, stackFrame.Line);
}

return stackFrame;
}

关于c# - 获取 ASP.NET Core 中发生异常的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38327806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com