gpt4 book ai didi

asp.net-web-api - 在 F# 中实现 IExceptionHandler 或 IExceptionLogger 等消息处理程序时,返回 "empty task"的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 20:10:05 26 4
gpt4 key购买 nike

在 C# 中实现这些处理程序时,我会做类似的事情,

public class DefaultExceptionHandler : IExceptionHandler
{
public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
{
context.Result = new ErrorActionResult(context.Request, context.Exception);

return Task.FromResult(0);
}
}

在 F# 中实现相同的接口(interface)时,我执行了以下操作,

type DefaultExceptionHandler() =

let mapExceptionTypetoHttpStatusCode (ex:Exception) : HttpStatusCode =
match ex with
| :? ArgumentException -> HttpStatusCode.BadRequest
| _ -> HttpStatusCode.InternalServerError

interface IExceptionHandler with
member x.HandleAsync (context:ExceptionHandlerContext, cancellationToken:CancellationToken) =
let request = context.Request
let ex = context.Exception
let httpStatusCode = mapExceptionTypetoHttpStatusCode ex

context.Result <- { new IHttpActionResult with member x.ExecuteAsync(token:CancellationToken) = Task.FromResult(request.CreateErrorResponse(httpStatusCode, ex)) }
Task.FromResult(0) :> Task

编译器需要转换 Task.FromResult(0) :> Task,这在 C# 示例中不是必需的。从 F# 中的 ExecuteAsync 方法返回的正确且惯用的方法是什么?

最佳答案

F# 编译器需要强制转换,因为在 F# 中没有自动转换为父类(super class)型(或任何其他类型)。这是 F# 的一个非常有用的功能,它可以防止一整类错误,其中转换为父类(super class)型会改变程序的含义。

所以在你的程序中使用这个强制转换运算符是完全没问题的。如果您不想输入太多内容,您还可以要求编译器为您推断类型:

let a: obj = "abcd"          // No cast - compile-time error
let b: obj = "abcd" :> obj // Explicit cast to supertype
let c: obj = "abcd" :> _ // Explicit cast to inferred supertype

如果您确实想取消强制转换,可以使用返回 Task 的任务创建方法。立即,而不是 Task<T> ,这需要进行转换。一种这样的方法是 Task.Run( Action ) :

let t = Task.Run( fun() -> () )   // t: Task

但这更加浪费。

关于asp.net-web-api - 在 F# 中实现 IExceptionHandler 或 IExceptionLogger 等消息处理程序时,返回 "empty task"的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36699555/

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