ID不匹配时返回错误请求

问题描述

如果cardMethod.ID与付款ID不匹配,则尝试返回badrequest,但当前它返回500内部服务器错误“对象引用未设置为对象的实例”我将在哪里或如何返回基于以下逻辑的错误。我不确定是应该在控制器中处理还是应该在服务层中处理。

目前,服务层主要处理条带异常。

还是应该尝试在控制器中实现try catch?

服务等级

        public async Task<VersionResponse> DeletePaymentMethod(string paymentID,string userId)
        {
            try
            {
                StripeConfiguration.ApiKey = _appSettings.StripeSecretKey;

                var profile = await _userManager.FindByIdAsync(userId);

                var stripeId = profile.StripeAccountId;

                if (stripeId == null)
                    throw new ArgumentException("No associated Stripe account found.");

                var service = new PaymentMethodService();

                //list the payment methods
                var cardPaymentMethods = service.ListAutoPaging(new PaymentMethodListOptions
                {
                    Customer = stripeId,Type = "card"
                });

                //Detach card which matches with list of payment methods
                var cardMethod = cardPaymentMethods.Where(m => m.Id == paymentID).FirstOrDefault(); 

                if(cardMethod.Id != paymentID)
                    throw new ArgumentException("Payment method not found for specified id.");

                await service.DetachAsync(cardMethod.Id,new PaymentMethodDetachOptions());

                return new VersionResponse
                {
                    Data = cardPaymentMethods
                };
            }
            catch (Exception ex)
            {
                throw HandleStripeExceptions(ex);
            }
        }

PaymentMethodController

        [HttpDelete]
        [ProducesResponseType(typeof(FluentValidation.Results.ValidationResult),400)]
        public async Task<IActionResult> DeletePaymentMethod(string paymentID)
        {
            var userId = User.Claims.FirstOrDefault(x => x.Type == "UserID").Value;
            var result = new SuccessResponse()
            {
                success = true
            };

            
            await _paymentService.DeletePaymentMethod(paymentID,userId);

            if (string.IsNullOrEmpty(paymentID))
                return BadRequest("Payment method not found for specified id.");

            return Ok(result);
        }

    private Exception HandleStripeExceptions(Exception ex)
    {
        if (ex is StripeException e)
        {
            switch (e.StripeError.ErrorType)
            {
                case "card_error":
                    Console.WriteLine("Code: " + e.StripeError.Code);
                    Console.WriteLine("Message: " + e.StripeError.Message);
                    break;
                case "api_connection_error":
                    break;
                case "api_error":
                    break;
                case "missing_parameter":
                    break;
                case "authentication_error":
                    break;
                case "rate_limit_error":
                    break;
                case "validation_error":
                    break;

                default:
                    // Unknown Error Type
                    break;
            }

            return ex;
        }
        else
        {
            return ex;
        }
    }

解决方法

我认为500错误是由于

if(cardMethod.Id != paymentID)
  throw new ArgumentException("Payment method not found for specified id.");

cardMethod可以为null,应在if语句中检查null,例如

if(cardMethod == null)

在任何情况下cardMethod.Id != paymentID都是正确的。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...