我刚刚开始使用主题exceptionhandling
。我读了很多关于它的positiv的东西,所以我认为我应该这样做,因为我目前使用错误代码的技术真的很难看......
好的,我们有以下场景:用户在textbox
中输入了密码。按下登录按钮后,他会收到一个积极或消极的消息。
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
。希望你能帮助我一点。谢谢!
我switch/case construct
内有public void btnCT_Click()
。
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;
}
这是我从另一个班级开始的方法。类名不重要。
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;
}
答案 0 :(得分:3)
我要说的第一件事就是你不需要为此而自定义例外。仅仅查看方法的名称(for mutation in queue {
mutation.handleMutation(forState: state)
}
),任何人都希望此方法返回true / false布尔值而不是异常。
所以你可以有一个更简单的
IsPasswordCorrect
但是,如果你真的需要抛出一个异常(请记住,这在性能方面是一个代价高昂的操作),那么不要在抛出它的方法中捕获它,而是让它冒泡到达调用代码< / p>
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
....
并在调用代码中(在UI级别)添加try catch块
public bool IsPasswordCorrect(string password)
{
if(password != "fooBar")
throw new InvalidPasswordException("You entered the wrong password. Try again");
....
}
在任何情况下,异常仅应用于例外原因。您不能使用它们来驱动代码。在这种情况下,最好的方法是返回一个真/假值。
当失败原因很复杂时,我通常会使用这种方法
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);
}
当然,数据库类中的每个布尔方法,当有理由失败并返回false之前,会设置一个全局变量,其中包含失败所涉及的确切错误消息,因此客户端代码可以轻松处理消息。已完成通话。