从布尔方法捕获异常消息

时间:2014-05-28 09:34:57

标签: c# exception-handling return-value

我见过类似的问题,但不完全是这样:

我想知道确定方法是否正确执行的正确方法,返回布尔值,如果方法未执行,则知道原因,即使抛出异常。

我是这样做的,但我认为捕获内的return是一种不好的做法,所以这是正确的方法?:

if(!myObject.DoSomething('A', out result))
{
    MessageBox.Show(myObject.ErrorMessage);
    [...]
}else{
    MessageBox.Show(result);
    [...]
}

class myObject()
{
    public string ErrorMessage;

    bool DoSomething(char inputValue, out string result)
    {
        try
        {
            if(inputValue == 'A')
            {
                ErrorMessage = "Bad input value: " + inputValue;
                return false;
            }
            [...]
            return true;
        }catch(Exception ex){
            ErrorMessage = ex.Message;
            return false;
        }
    }

我不想在catch内部转发异常,因为我失去了对应用程序的控制(我无法获得描述),并且异常总是在表单中完成。如果我在表单中显示异常,我不需要在其他类中尝试catch。

我的意思是try {} catch(Exception ex) { throw ex;}与不使用try catch相同。

非常感谢

3 个答案:

答案 0 :(得分:1)

我的建议是创建自己的Exception类型(可能是全局的),并将其作为参考传递。

此后,您仍然可以取回指示成功或失败的布尔值(并且只有一次返回try..catch之外)。

 public class CustomException
 {
    private string _message;
    private string _title;

    public CustomException()
    {
      _title = "";
      _message = "";
    }

    public CustomException(string title, string message)
    {
      _title = title;
      _message = message;
    }
 }

然后调用传入CustomException实例的DoSomething(在本例中为ce)。

CustomException ce = new CustomException();

请注意,这是解决必须返回指示成功或失败的布尔值并知道消息的问题的最佳过程,例如;将其转储到日志文件或登录到数据库(特别是对于服务调用 - WCF)

然而,这不是解决业务流程中错误逻辑的解决方案。

答案 1 :(得分:0)

捕获中的

Return false本身并不是不好的做法。当你处理一段代码的异常并且它一定不会失败时它很有用。

例如,我正在处理一台打印机试用DLL,此DLL必须读取包含多个要打印的记录的XML文件。该方法不能失败,因为一条记录无法打印,但如果XML文件格式不正确,它仍然可以返回异常。

public void Print(string xmlFile)
{
    if (String.IsNullOrWhiteSpace(xmlFile))
        throw new ArgumentNullException("No xml file has been passed to the Print method.");

    // This line will most likely throw an exception if the XMl file is not well formated
    XDocument dom = XDocument.Load(xmlFile);
    foreach (XElement n in dom.XPathSelectElements("//RECORDS/RECORD"))
    {
        try
        {
            // send commands to the printer, if the printer fails to print, throw a PrinterRecordException
        }
        catch (PrinterRecordException e)
        {
            // log print failure, but keep on printing the rest
            continue;
        }
        catch (Exception e)
        {
            // dunno what happened, but still have to print the rest
            continue;
        }
    }
}

在此示例中,如果此程序不关心,我的函数可以返回false而不是向主程序抛出异常。在我的情况下它确实:p在我看来,这就是你应该如何思考你的方法。

答案 2 :(得分:0)

异常处理方法和最佳实践是一些主观问题。我无法证明我将要呈现的方法,因为我刚刚开始在我自己的项目中使用它。

我建议使用静态ExceptionHandler类,您可以使用该类注册由通用参数及其相应处理程序处理的任何异常。如果您希望在发生特定异常时显示某种消息框,这将使您的业务逻辑与UI分离。

以下是一个例子:

/// the real implementation uses lambda's and/or implementations of IExceptionHandler<TException>
ExceptionHandler.Register<InvalidPasswordException>(() => /*some handler logic*/);

// ... else where in the code ...
catch (InvalidPasswordException ex)
{
    // do resource clean-up and raise exception for listeners such as the UI or logging infrastructure.
    ExceptionHandler.Raise(ex);
}

到目前为止,这看起来很有希望,特别是与我之前的方法相比。但只有时间会证明。

<强>更新

ExceptionHandler类本身不一定是静态的,例如,如果您使用的是分层体系结构,则可能希望在应用程序的不同层具有ExceptionHandler的不同实例。