引发级联异常

时间:2018-08-07 06:28:41

标签: c# exception-handling

我想将多个错误消息传递给GUI。我该怎么做?请简短看一下我上面的抽象示例:

try
{
    LogIn(usr, pwd); //entry point
}
catch(Exception ex)
{
    throw new Exception("Login failed.");
}



public void LogIn(string usr, string pwd) {

    if(usr == "") {
        throw new Exception("Username was empty.");
    }

    if(pwd== "") {
        throw new Exception("Password was empty.");
    }

    try
    {
        //do some other stuff without a more specific error message
    }
    catch
    {
        throw;
    }  
}

稍后我想得到类似这样的结果错误消息

  

登录失败。密码为空。

如果用户未输入密码。现在,我只获得最后一条错误消息(“登录失败。”),因此我只想将一半信息提供给用户。

3 个答案:

答案 0 :(得分:4)

您可以嵌套例外:

try
{
    LogIn(usr, pwd); //entry point
}
catch(Exception ex)
{
    throw new Exception("Login failed.", ex);
}

请注意第二个参数和ExceptionInnerException属性。

但是在执行操作之前,请考虑上述代码块是否正在添加任何值。如果仅让Password was empty异常转义,则调用者通常仍会知道登录失败,并且该异常似乎包含所有必需的信息。

只有catch是例外,如果您有有用的要做的事情-如果您可以恢复错误情况,添加信息或不想向调用者公开实现细节。否则,让异常上升到可以完成有用的 的水平。

答案 1 :(得分:3)

我会重新考虑您的结构。 正如评论中指出的那样,有一些事情要考虑:

  • 该方法是否会在其他地方调用,从而导致错误的使用?
  • 如果我在流控制中使用异常,是否会导致代码无法读取? (Using exceptions for flow control

使用List<string>来收集问题的方法:

public void LogIn(string usr, string pwd) 
{   
    List<string> errors = new List<string>();

    if(string.IsNullOrEmpty(usr)) 
    {
        errors.Add("Username is empty.");
    }

    if(string.IsNullOrEmpty(pwd)) 
    {
        errors.Add("Password is empty.");
    }   

    if(errors.Count > 0) // If errors occur, throw exception.
    {
        throw new Exception(string.Join("\r\n",errors));
    }   
}

答案 2 :(得分:1)

您可以只使用ex.Message,它可以是密码为空。用户名为空。