Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抛出级联异常_C#_Exception Handling - Fatal编程技术网

C# 抛出级联异常

C# 抛出级联异常,c#,exception-handling,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

我想向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;
    }  
}
稍后我想得到一个结果错误消息,如

登录失败。密码为空

如果用户没有输入密码。现在我刚刚收到登录失败的最后一条错误消息。因此,我想给用户的信息只有一半。

您可以使用ex.Message,它可能是密码,也可能是空的。或用户名为空。

您可以嵌套异常:

try
{
    LogIn(usr, pwd); //entry point
}
catch(Exception ex)
{
    throw new Exception("Login failed.", ex);
}
请注意第二个参数和的InnerException属性

但在做之前,请考虑上面的块是否添加了任何值。如果您只是让密码为空,则通常情况下,调用方仍会知道登录失败,并且该异常似乎包含所有必需的信息


只有当您有一些有用的事情要做时才捕获异常—如果您可以恢复错误条件、添加信息或不想向调用者公开实现细节。否则,让异常上升到可以做一些有用的事情的水平。

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

该方法是否会在其他地方调用,并可能导致错误使用? 如果在流控制中使用异常,是否会导致代码无法读取? 收集问题清单的方法:
作为个人偏好,我更喜欢使用更具体的异常类型。我会将其更改为ArgumentNullExceptionUsername为空,并在调用登录方法之前抛出它。NET中的异常处理是为了改进旧方法的错误处理,在旧方法中,需要记住检查被调用方法或函数的返回值。检查字符串列表听起来像是一个糟糕的主意。您甚至可以在登录方法中抛出此异常。您还可以创建自己的异常类型,即类LoginException:Exception,它将封装错误列表。但是要小心。@MickyD-另一方面,验证错误几乎不例外,因此在这里使用异常是值得怀疑的。@Damien_不相信异常的人。QED。考虑到这一点,我得出了你的结论perplexing@MickyD-ArgumentNullException是报告程序员错误的异常。此代码正在处理用户错误。我的回答是提供书面问题的答案。这并不意味着这是唯一可能的观点,碰巧我也同意Smartis对这一点的看法。
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));
    }   
}