gpt4 book ai didi

c# - 如何在抛出自定义异常时显示错误消息

转载 作者:行者123 更新时间:2023-11-30 21:45:57 24 4
gpt4 key购买 nike

我刚刚开始讨论主题exceptionhandling。我读了很多关于它的正面资料,所以我想我也应该这样做,因为我目前使用错误代码的技术真的很难看......

好的,我们有以下场景:用户在 文本框 中键入了他的密码。按下登录按钮后,他会收到正面或负面消息。

MainWindow.xaml

<TextBox x:Name="txtBoxUserPassword/>
<Button x:Name="btnLogin" Click="btnLogin_Click">Login</Button>

MainWindow.xaml.cs

private void btnCT_Click(object sender, RoutedEventArgs e)
{
DataBase db = new DataBase();
db.IsPasswordCorrect(this.txtBoxUserPassword.Text);

// How can I catch here the exception from the class to
// show the error notification?
}

DataBase.cs

public class DataBase{
public void IsPasswordCorrect(string password)
{
try{
if(password != "fooBar")
{
throw new InvalidPasswordException("You entered the wrong password. Try it again.");
}
else
{
/*
...
*/
}
}
catch(InvalidPasswordException ex){
// What should I do here? I want to give the user an
// error message with the content "You entered the wrong
// password. Try it again."
}
}
}

InvalidPasswordException.cs

public class InvalidPasswordException: Exception
{
public InvalidPasswordException(string message, Exception inner)
: base(message, inner)
{
}
}

如您所见,这是我第一次使用exceptions。希望你能帮我一点忙。谢谢!

编辑

我的 public void btnCT_Click() 中有这个 switch/case 结构

switch (CheckString("EnteredString"))
{
case 1:
MessageBox.Show("Error 1");
break;
case 2:
MessageBox.Show("Error 2");
break;
case 3:
MessageBox.Show("Error 3");
break;
case 0:
MessageBox.Show("Successful");
break;
}

这是我在另一个类(class)的方法。类名并不重要。

public int CheckString(string enteredString)
{
if(enteredString length is larger 25 chars)
return 1;
else if(enteredString contains special characters)
return 2;
else if(enteredString dosent contain any number)
return 3;
else
return 0;
}

最佳答案

我要说的第一件事是,您不需要为此自定义异常。只看方法的名称 (IsPasswordCorrect),任何人都会期望此方法返回 true/false bool 值而不是异常。

所以你可以有一个更简单的

public class DataBase
{
public bool IsPasswordCorrect(string password)
{
if(password != "fooBar")
return false;
else
return true;
}
}

.... at the UI level ....
if(!db.IsPasswordCorrect("notA_fooBar"))
MessageBox.Show("You entered the wrong password. Try again");
else
....

但是,如果您确实需要抛出异常(请记住,就性能而言,这是一项代价高昂的操作),那么不要在抛出异常的同一方法中捕获它,而是让它冒泡到达调用代码

 public bool IsPasswordCorrect(string password)
{
if(password != "fooBar")
throw new InvalidPasswordException("You entered the wrong password. Try again");
....
}

并在调用代码中(在 UI 级别)添加 try catch block

private void btnCT_Click(object sender, RoutedEventArgs e)
{
try
{

DataBase db = new DataBase();
db.IsPasswordCorrect(this.txtBoxUserPassword.Text);

// If you reach this point the password is correct
// But it is ugly and unclear to any reader....

}
catch(InvalidPasswordException ex)
{
MessageBox.Show(ex.Message);
}

在任何情况下,仅应出于异常(exception) 原因使用异常。您不使用它们来驱动您的代码。在这种情况下,最好的方法是返回真/假值。


当失败原因比较复杂时我一般采用这种方式

bool ok = true;
ok = database.IsPasswordCorrect("fooBar");
if(ok) ok = database.Method1();
if(ok) ok = database.Method2();
if(ok) ok = database.Method3();

if(!ok)
MessageBox.Show(database.LastErrorMessage);

public class Database
{
public string LastErrorMessage { get; set; }
public bool Method1()
{
if(errorFoundForReason1)
{
LastErrorMessage = "Error found for reason1";
return false;
}
if(errorFoundForReason2)
{
LastErrorMessage = "Error found for reason2";
return false;
}
....
return true;
}
}

当然,数据库类中的每个 bool 方法,当有原因失败并返回 false 之前,都会设置一个全局变量,其中包含失败中涉及的确切错误消息,以便客户端代码可以轻松处理消息已完成通话。

关于c# - 如何在抛出自定义异常时显示错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39690683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com