抛出错误时,我是否应该在不同的存储过程中重复使用相同的错误号?

Should I reuse the same error number in different stored procedures when throwing errors?

我正在使用 Giraffe 框架在 F# 中实现 Web 服务器。 Web 服务器根据客户端请求执行一些存储过程。当无法处理请求时,存储过程中会抛出错误,我在 Giraffe 中捕获错误,如下所示:

try
     // parse request ...
    // data access and execute stored procdeure ...
with
| :? System.Data.SqlClient.SqlException as e ->
     match e.Number with
    | 60000 ->
        return! (setStatusCode 400 >=> json e.Message) next ctx

假设在存储过程 A 中,我抛出了错误编号 60000、错误消息 Error in stored procedure A 的错误。在另一个存储过程 B 中,我可以重复使用具有不同错误消息的相同错误编号还是应该使用不同的错误编号?

如果我不重复使用相同的错误编号,match 表达式将继续增长,如下所示:

  with
  | :? System.Data.SqlClient.SqlException as e ->
            match e.Number with
            | 60000 ->
                return! (setStatusCode 400 >=> json e.Message) next ctx
            | 60001 ->
                return! (setStatusCode 400 >=> json e.Message) next ctx
            // more error numbers in the future ...

我从未在 SQL 中实际使用过错误代码,所以我不知道什么是最佳做法,但我敢打赌它对一种错误类型和一条消息使用一种代码。您的建议是改变该建议,其唯一目的是缩短代码的其他部分。

即使您创建了很多错误代码,您也可以通过执行以下操作来避免代码重复

try ...
with
| :? SqlException as e ->
    match e.Number with
    | 60000 | 60001 ->
        return! (setStatusCode 400 >=> json e.Message) next ctx

如果这是您需要在多个地方执行的操作,请考虑将其拉出到它自己的独立函数中。如果错误代码列表变大,请考虑将其放入列表对象中,例如

open System.Linq

let sqlErrorCodes = [ 60000; 60001 ]

try ...
with :? SqlException e when sqlErrorCodes.Contains(e.Number) ->
    return! (setStatusCode 400 >=> json e.Message) next ctx