1

我有以下 Delete Action 方法,主要执行两个单独的任务:-

  1. 使用 API 调用从第三方应用程序中删除记录。
  2. 使用实体框架从我们自己系统上的数据库中删除一条记录。

我的操作方法如下:-

[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
    var message = "";
    var status = "";
    var tag = "";
    Resource resource = new Resource();
    try
    {
        Rack rack = repository.FindRack(id);
        tag = rack.Technology.Tag;
         resource = repository.GetResource(rack.Technology.IT360ID.Value);
    }
    catch (NullReferenceException)
    {
        return Json(new
        {
            IsSuccess = "False"
        }, JsonRequestBehavior.AllowGet);
    }
    catch (DbUpdateException)
    {
        return Json(new
        {
            IsSuccess = "AlreadyUsed"
        }, JsonRequestBehavior.AllowGet);
    }

    using(var client = new WebClient())
    {
        var query = HttpUtility.ParseQueryString(string.Empty);
         query["username"] = "testuser";
        query["assetType"] = resource.ComponentDefinition.ComponentType.COMPONENTTYPENAME;
        query["operation"] = "DeleteAsset";
        query["assetName"] = resource.RESOURCENAME;
        var url = new UriBuilder("http://win-spdev:8400/servlets/AssetServlet");
        url.Query = query.ToString();
        try
        {
            string xml = client.DownloadString(url.ToString());
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            status = doc.SelectSingleNode("/operation/operationstatus").InnerText;
            message = doc.SelectSingleNode("/operation/message").InnerText;
        }
        catch (WebException ex)
        {}
    }

    if (status.ToUpper() == "SUCCESS")
    {
        try
        {
            repository.DeleteRack(id, User.Identity.Name);
            repository.Save();
             return Json(new
            {
                IsSuccess = "True", id = id, description = tag
            }, JsonRequestBehavior.AllowGet);
        }
        catch (NullReferenceException)
        {
            return Json(new
            {
                IsSuccess = "False"
            }, JsonRequestBehavior.AllowGet);
        }
        catch (DbUpdateException)
        {
            return Json(new
            {
                IsSuccess = "AlreadyUsed"
            }, JsonRequestBehavior.AllowGet);
        }
    }
     return RedirectToAction("Delete", new
    {
        id = id
    });
}

因为我使用实体框架来执行删除和 API 调用,所以我最终得到了单独的 try/catch 块。那么我的操作方法逻辑是否认为设计不佳,因为我在同一个操作方法中有多个 try/catch 块?我可以遵循什么更好的方法?

4

3 回答 3

2

单独的错误案例当然不是一个坏习惯。

然而,不好的做法是捕捉非特定的错误。您正在为所有 DbUpdateExceptions返回“AlreadyUsed” 。除了您计划的原因之外,可能还有其他原因。如果发生这种情况,您会吞下错误并有一个无声的错误。您现在可能缺乏对这些情况的想象,但这只是因为您在错误发生之前永远不知道错误。我建议您通过解释异常对象(可能解释消息,上帝保佑)或通过将 catch 覆盖的区域收紧到可能给出错误的语句来捕获比这更具体的内容。

简而言之,不要吞下表示错误的异常。错误一直在发生,您想了解它们并修复它们。

此外,出于同样的原因,永远不要抓到NullReferenceException. 按照惯例,它们总是错误。插入一个if已经处理的null.

于 2013-07-31T20:59:02.347 回答
1

如果 try-catch 中的代码是一个“逻辑实体”,例如执行一个不会影响其余代码的独立功能,或者如果它有错误不会导致后续代码的逻辑不正确(不正确执行)。那为什么不呢。

但是,如果它会破坏您的程序逻辑,那么应该停止它并处理错误(您的 try-catch 块的范围。这完全取决于您的程序逻辑。

于 2013-07-31T20:59:16.753 回答
1

将 try-catch 范围限制在尽可能少的范围内并没有错。
(我可能会因此而发火。)

于 2013-07-31T20:54:55.487 回答