gpt4 book ai didi

c# - (为了提高性能)确定异常类型的更好方法是哪种?

转载 作者:行者123 更新时间:2023-12-03 09:03:48 25 4
gpt4 key购买 nike

我已经从OnException覆盖了ExceptionFilterAttribute

    public override void OnException(HttpActionExecutedContext context) {

base.OnException(context);
}

当引发错误并通过异常作为参数传递时调用此方法:- context.Exception
哪种性能是确定错误类型的最佳方法:

1)。 throw
    //create a new response that will be sent to the API consumer
var response = new System.Net.Http.HttpResponseMessage();
//throw the error that came through to catch it specifically
try {
throw context.Exception;
}
catch (System.IO.FileNotFoundException) {
response.StatusCode = HttpStatusCode.NotFound;
}
catch (Exception) {
response.StatusCode = HttpStatusCode.InternalServerError;
}

2)。获取类型
        //create a new response that will be sent to the API consumer
var response = new System.Net.Http.HttpResponseMessage();

//switch on the exception type
if (context.Exception.GetType() == typeof(System.IO.FileNotFoundException)) {
response.StatusCode = HttpStatusCode.NotFound;
}
else if (context.Exception.GetType() == typeof(Exception)) {
response.StatusCode = HttpStatusCode.InternalServerError;
}

3)。 其他方式?

最佳答案

我怀疑(尽管尚未确认)第一种方法将破坏堆栈跟踪数据,或者以其他某种方式修改异常本身并丢失原始信息。即使碰巧它没有执行此操作,但出于性能和语义方面的考虑,它仍然不是很好。 throw编码很昂贵,调试时很难确定异常的来源,并且打破了从不对逻辑流使用异常的标准规则。

第二种方法的结构更好,但是可以改进其实现。像这样:

var response = new System.Net.Http.HttpResponseMessage();

if (context.Exception is System.IO.FileNotFoundException) {
response.StatusCode = HttpStatusCode.NotFound;
}
else {
response.StatusCode = HttpStatusCode.InternalServerError;
}

更新:注释是正确的,对于 Exception类型,其他任何异常的运行时检查都将成功,因此不需要检查。只需检查特定的异常类型,然后默认为其他任何类型即可。

关于c# - (为了提高性能)确定异常类型的更好方法是哪种?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28280251/

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