如何解决无法在自定义C#异常中访问StackTrace
我最近尝试为我的Web API设置日志记录系统。我决定要创建可以由GlobalExceptionHandler抛出然后记录的自定义Exception类。但是,访问自定义Exception对象的StackTrace时遇到一些问题。
我设置了一个名为LoggableException的自定义Exception类,该类用作要登录到数据库的所有自定义Exception的父类。
public class LoggableException : Exception
{
public LogEntity Log { get; set; }
public string ResponseMessage { get; set; }
public LoggableException(LogEntity _log,string _responseMessage) : base(_log.ExceptionMessage)
{
Log = _log;
Log.Level = LogLevel.Warn;
Log.Exception = GetType().Name;
Log.StackTrace = StackTrace.Substring(0,1000);
ResponseMessage = _responseMessage;
}
}
以下是我的自定义LoggableException之一的示例:
public class InvalidPassword : LoggableException
{
public InvalidPassword(string email) : base(new LogEntity()
{
ExceptionMessage = $"Invalid password. email: {email}",ResponseCode = (int) HttpStatusCode.Unauthorized
},$"Unknown email or incorrect password.")
{ }
}
但是,似乎每当我抛出其中一个LoggableExceptions时,<System.NullReferenceException: Object reference not set to an instance of an object.
也会被抛出Log.StackTrace = StackTrace.Substring(0,1000);
。我这样做是为了不在数据库中存储巨大的StackTrace字符串,但是StackTrace始终为null。我以为如果调用基本构造函数,它将自动实例化StackTrace,但是我想我错了。谁能向我解释我在这里做错了什么?我对C#还是比较陌生。
解决方法
抛出NullReference异常是因为您要访问在构造函数本身内部构建的实例的StackTrace属性。
您应该使用
Log.StackTrace = StackTrace?.Substring(0,1000);
或
if(StackTrace!=null) Log.StackTrace=StackTrace.Substring(0,1000);
相反,要确保this.StackTrace已实例化
您应该小心ArgumentOutOfRangeException,当StackTrace长度小于1000个字符时会抛出该异常
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。