簡體   English   中英

自定義例外-我做對了嗎?

[英]Custom exceptions - Am I doing it right?

我目前正在編寫.net REST網絡api,並且正在使用自定義異常,以便可以將詳細信息以及正確的http響應發送回客戶端,以保持與REST的兼容性。.但是看來我在明確拋出很多例外。

例如:我有一個用於上傳圖像文件的API。 這些圖像文件必須是某種文件格式,並且必須具有某種大小。 如果我的代碼發現圖像是錯誤的文件格式,則拋出新的自定義異常,例如:

throw new FileTypeException();

或者,如果文件太大,則意味着file.Size()大於我在web.config中設置的數量,那么我將拋出另一個自定義異常,例如:

throw new FileSizeException();

然后,我在Post()方法中捕獲這些異常,並返回400 BadRequest和一個原因。

因此,我的代碼實際上並沒有引發錯誤,只是請求不符合規范。 這是不好的做法嗎?

這可能比編程溢出更適合作為編程問題。

在正確的場景中拋出自定義異常可能非常有用,而在錯誤的場景中拋出很多不必要的工作和復雜性。 通常,我使用的健全性檢查對每種不同的異常類型都有不同的處理方式。

例如,您的FileTypeException和FileSizeException-每種類型都有不同的catch嗎? 還是您只是返回不同的消息?

如果是后者,請嘗試合並您可以使用的地方或使用框架提供的異常。 如果是前者,那么您使用的是自定義例外。

異常過濾器非常適合這些情況。 在您的WebApiConfig中,注冊一個異常過濾器

config.Filters.Add(new CustomExceptionFilterAttribute());

基本過濾器的代碼:

//needed for CreateErrorResponse(statusCode, message)
using System.Net.Http

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        //you can get the underlying exception here
        var type = context.Exception.GetType();

        //I like to map exception types to status codes
        var statusCode = GetHttpStatusCode(type);

        //respond with a proper status code and the message
        context.Response = context.Request.CreateErrorResponse(statusCode, context.Exception.Message);
    }
}

現在,在任何控制器代碼中,您都可以拋出該代碼,它將擊中您的過濾器

public IHttpActionResult Get(int id)
{
    throw new FileSizeException();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM