捕捉异常&保持GUI逻辑分离

时间:2012-07-04 14:24:55

标签: c# .net exception exception-handling

在这种情况下,您如何更正处理异常的方法?最初我希望以下列方式使用trycatch可以捕获上传失败时助手类抛出的异常。

我的目标是返回“false”并打开一个Messagebox,并显示错误消息,我将从我的上传尝试中提取HTML响应。 我试图这样做,而不是采取不好的做法,并将GUI代码放在我的助手类。

        try
        {
            // returns bool
            successful = UploadHelper.Upload(uploadToPath, File.ReadAllBytes(uploadFromPath), properties);
        }
        catch (Exception ex)
        {
            string error = ex.Message;
        }

助手类:

    public static bool Upload(string webUrl, string documentName, byte[] bytes, Dictionary<string, object> metaInfo, out string result)
    {
        try
        {
            using (WebClient webClient = new WebClient())
            {
                //result is HTML string containing data
                result = Encoding.UTF8.GetString(webClient.UploadData(webUrl + "/_vti_bin/_vti_aut/author.dll", "POST", data.ToArray()));

                // if fails throw exception
                if (result.IndexOf("\n<p>message=successfully") < 0)
                    throw new Exception(result);
            }
        }
        catch (Exception ex)
        {
            result = ex.Message;

            // Upload failed
            return false;
        }
        // Upload succeeded
        return true;
    }

This slightly similar question让我以为我可以通过自定义异常解决此问题。但是,阅读this explanation of creating them让我对如何使用它们来解决这种情况感到困惑 - 因为它似乎只会将Messagebox代码移动到Exception类,而E​​xception类也不是它的好地方。

我很确定这是一种我无论如何都有理由使用自定义异常的情况,因为用户可以根据返回的错误消息解决问题。所以我还是从前面提到的指南中写的(为简单起见,省略了代码示例)。

1 个答案:

答案 0 :(得分:5)

如果您要在UI中显示异常消息,并且此处的catch块只是为了获取消息,为什么要在此处捕获它?如果处理在UI中,那么将其捕获(或靠近那里),然后抓住并在该级别显示消息。

在这种情况下,您通常会使用异常处理来获取特定异常并从中提取信息以便以特定方式报告(将错误消息抽象为下面的Charleh注释),或者驱动某种自动重试逻辑。但是如果一个名为Upload的方法在上传内容失败的情况下抛出异常,那绝对没有错。