【问题标题】:throwing an exception from method call into textbox将方法调用的异常抛出到文本框
【发布时间】:2011-12-22 14:28:31
【问题描述】:

我正在尝试让我的页面调用一个方法,如果它失败,则在我的 mbResult 控件中显示一个错误。但是,由于我的方法是一个 void 方法,我很难抛出异常。如果我从方法端抛出它,它不会显示在我的错误框中。

我的页面中有以下代码:

try
{
    Facade.AcceptChanges();
} 
catch(FarAlreadyExistsException) 
{
    mbResult.Message = new MessageInfo(FutureActivitiesAlreadyExistsMessage);
    return;
}

accept changes 方法是这样的

public void AcceptChanges() 
{
    try
    {
        DataContext.SaveChanges();
    }
    catch (Exception) 
    {
        return;
    }
}

【问题讨论】:

  • 以这种方式吞噬异常可不是什么好事。
  • catch (Exception) { return; } 这是非常糟糕的做法。

标签: c# exception error-handling


【解决方案1】:

删除第二个 try-catch 让异常在你的第一个 catch 块中被捕获:

public void AcceptChanges() 
{
    DataContext.SaveChanges();
}

编辑:看来您应该应用以下更改:

try
{
    Facade.AcceptChanges();
} 
catch(Exception) // according to the documentation, this should be an OptimisticConcurrencyException
{
    mbResult.Message = new MessageInfo(FutureActivitiesAlreadyExistsMessage);
    return;
}

【讨论】:

  • 我试过了,但我的程序在 DataContext 停止了
  • “停止”是什么意思?你得到的Exception 是否与FarAlreadyExistsException 不同?
【解决方案2】:
public void AcceptChanges() {
            try
            {
                DataContext.SaveChanges();
            }
            catch (Exception cause) {
                throw new FarAlreadyExistsException(cause);
            }
        }

你不会抛出异常,所以你不会在第一个方法的 try-catch 中捕获它

【讨论】:

  • 吞下原始异常是一种不好的做法。您也应该传递原因:catch (Exception e) { throw new FarAlreadyExistsException(e); }
【解决方案3】:

如果您不打算做任何事情,则不应处理 AcceptChanges 中的异常。它只是吞下错误,所以你的外部 try...catch 块不会看到它(catch 块中的代码不会被触发。

删除try...catch 方法中的try...catch,然后调用它的方法中的catch 代码将捕获异常(只要它的类型正确。

【讨论】:

  • 不回答问题。这将是一个更好的评论(有人已经离开了)。
  • 我正在回答为什么不抛出的问题。所以,我想我已经回答了这个问题。 (可能我在你评论的时候编辑了忍者?)
  • 是的。当我评论时,你回答的只是“如果你不打算做任何事情,你不应该处理 AcceptChanges 中的异常”——这是评论,而不是答案。
  • @jadarnel27:这不是评论,而是答案。异常吞咽是导致原始提问者问题的原因。
  • @C.McAtackney 我非常不同意。当我投反对票时,这不是答案——而是评论。 现在这是一个答案(在忍者编辑之后),尽管与所有其他答案相同。
【解决方案4】:

AcceptChanges() 方法中不要有通用的try-catch 语句。让出现在DataContext.SaveChanges() 内部的Exception 冒泡到第一段代码中的try-catch

您应该只处理您预期的异常(除非您真的不在乎一段代码是否失败)。并且您应该只在关心异常的确切位置处理异常。

【讨论】:

    【解决方案5】:

    您正在吞噬AcceptChanges 中的异常。删除AcceptChanges中的Try;Catch;,让它冒泡。

    【讨论】:

      【解决方案6】:

      您不应该在AcceptChanges() 中捕获异常,然后让第一个 try-catch 块处理它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-22
        • 2017-05-31
        • 2011-10-22
        • 2012-07-30
        • 2016-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多