我发现自己在Web开发中使用异常,即使是非真正错误的条件,更不用说特殊的 - 只是逻辑决策,验证......
在网页中,我经常编写如下代码:
try
{
int id;
if(!int.TryParse(txtID.Text, out id))
throw new Exception("ID must be an integer");
if(IdAlreadyExists(id))
throw new Exception("ID already exists in database");
//and so on...
}
catch(Exception ex)
{
SetErrorLine(ex.Message);
}
我想知道这是否是在Web开发中使用异常和强制执行业务逻辑的正确方法。
P.S。:我正在使用asp.net,显然我可以将ASP.NET验证器用于其中一些,并且还可以从逻辑中分离UI,但我试图在一般想法上指出。
答案 0 :(得分:6)
你刚刚回答了自己的问题。
例外情况适用于特殊情况。假设您发布的代码来自一个以“ID”作为用户输入的页面,那么用户输入就不好了。使用验证基础结构,或手动执行,但不要使用例外。
此外,不要养成向用户显示Exception.Message
的习惯。它旨在让开发人员了解错误以及如何解决问题。
答案 1 :(得分:1)
我不认为第一个例子是可接受的Exception使用。用户可以轻易搞砸输入该信息,并且无论如何都应该验证用户输入。
异常应该是'例外'。你不希望发生的事情不应该发生,或者真的不希望发生。在需要抛出异常之前可以验证或处理的任何事情都应该被视为错误。
答案 2 :(得分:0)
不同的社区在可接受的例外使用方面存在差异。使用例外时,Python社区更加自由:http://wiki.sheep.art.pl/Ask%20for%20Forgiveness
我喜欢使用它们,只要它不会破坏你的应用程序的逻辑。
答案 3 :(得分:0)
只是想为asp.net添加一个全局异常处理程序HttpModule来捕获未处理的异常是一种非常干净的方式来训练自己的try / catch / finally滥用。
答案 4 :(得分:0)
当您的方法所采用的假设被破坏或者方法无法完成时,抛出异常。
在您的示例中,您的IdAlreadyExists方法可能会查询数据库。该方法将假设有一个数据库要连接,你有足够的内存来做你需要的,等等。如果假设被打破,则抛出异常。
我,其中一个,喜欢让低级代码抛出异常,更高级代码捕获异常。这不是一个严格而快速的规则,只是我喜欢遵循的一般准则。通常没有必要将异常抛到同一级别,但我可以想象它有时会有意义。
答案 5 :(得分:0)
still missing the way it SHOULD be done
设置错误信息并返回。
记录错误,不要将其显示给用户。
protected void Button1_Click(object sender, EventArgs e)
{
try
{
int id = 0;
if(!int.TryParse(txtID.Text, out id))
{
SetErrorLine("Thats not a valid number dude! Need to go to school again");
return;
}
if(IdAlreadyExists(id))
{
SetErrorLine("I already have this entry in store. Sorry. Call again!");
return;
}
...the rest of your code
}
catch(Exception ex)
{
_log.Error(ex);
SetErrorLine("Something unexpected happened dear user ... ");
}
}
修改:您的评论
try {
string error = "";
int id = 10;
if(BO.DoSomething(out error, id, otherParams))
{
SetErrorLine(error);
return;
}
}
catch(Exception ex)
{
//log
}
我的猜测:
try {
string meaningfullErrorMessage= "";
int id = 10;
if(!BO.DoSomething(out meaningfullErrorMessage, id, otherParams))
{
SetErrorLine(meaningfullErrorMessage);
return;
}
}
catch(Exception ex)
{
//log
}