【问题标题】:How to pattern match exception with type test in F#?如何在 F# 中将异常与类型测试模式匹配?
【发布时间】:2020-09-05 15:14:07
【问题描述】:

我有一个函数,我需要在以下 sn-p 中模式匹配(不是try...with异常与类型测试:

module Error =

    type Codes =
        | InvalidUser = 0
        | InvalidEmail = 1

    exception AppException of Codes

    let errorHandler (e: exn) =
        // This doesn't work
        match e with
        | :? AppException as err(code) ->
            code.ToString()
        | _ -> e.Message

errorHandler 是一个通用函数,用于捕获 AppExeption 以及应用程序中的其他未处理异常。

如何将模式匹配与 Type Test 结合使用并解构/检索code 作为AppException 的一部分?

【问题讨论】:

    标签: f#


    【解决方案1】:

    为了达到您最终想要完成的目标,我将在此处进行两项更改:

    1. Codes 从枚举更改为 DU
    2. 放弃类型测试,因为 F# 定义的异常不需要它

    它可能看起来像这样:

    open System
    
    module Error =
    
        type Codes =
            | InvalidUser
            | InvalidEmail
    
        exception AppException of Codes
    
        let errorHandler (e: exn) =
            match e with
            | AppException codes ->
                match codes with
                | InvalidUser -> "invalid users!"
                | InvalidEmail -> "invalid email!"
            | _ -> e.Message
    

    或者,如果嵌套模式匹配冒犯了您,您可以在这种情况下将其展平:

    let errorHandler (e: exn) =
        match e with
        | AppException InvalidUser ->
            "invalid user!"
        | AppException InvalidEmail ->
            "invalid email"
        | _ -> e.Message
    

    F# 定义的异常是有效的单案例区分联合,您可以直接在其上进行模式匹配。这里不涉及类型测试。

    如果Codes 必须保持为枚举,您仍然可以执行第一个代码示例,但您需要在内部匹配表达式中使用包罗万象的大小写,因为枚举实际上只是一个int

    let errorHandler (e: exn) =
        // This doesn't work
        match e with
        | AppException codes ->
            match codes with
            | Codes.InvalidUser -> "invalid users!"
            | Codes.InvalidEmail -> "invalid email!"
            | _ -> "something else?"
        | _ -> e.Message
    

    【讨论】:

      猜你喜欢
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多