异常(ab)用于Web开发

时间:2009-07-07 19:47:37

标签: asp.net

我发现自己在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,但我试图在一般想法上指出。

6 个答案:

答案 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 
}