Asp.net 异常(ab)在web开发中的使用

Asp.net 异常(ab)在web开发中的使用,asp.net,Asp.net,我发现自己在web开发中使用exception,即使这些情况并不是真正的错误,更不用说异常情况了——只是逻辑决策、验证 在网页中,我经常编写如下代码: 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

我发现自己在web开发中使用exception,即使这些情况并不是真正的错误,更不用说异常情况了——只是逻辑决策、验证

在网页中,我经常编写如下代码:

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开发中使用异常和强制执行业务逻辑的正确方法


注:我正在使用asp.net,显然我可以使用asp.net验证器来实现其中的一些功能,也可以将UI与逻辑分开,但我想强调一下总体思路。

你刚刚回答了你自己的问题,真的

例外情况适用于特殊情况。假设您发布的代码来自一个以“ID”作为用户输入的页面,那么用户输入错误也不例外。为此使用验证基础架构,或者手动执行,但不要使用异常


另外,不要养成向用户显示
Exception.Message
的习惯。这是为了让开发人员了解出了什么问题,以及如何修复它。

您刚刚回答了自己的问题,真的

例外情况适用于特殊情况。假设您发布的代码来自一个以“ID”作为用户输入的页面,那么用户输入错误也不例外。为此使用验证基础架构,或者手动执行,但不要使用异常


另外,不要养成向用户显示
Exception.Message
的习惯。这是为了让开发者知道错误是什么以及如何修复它。

< P>我不认为第一个例子是一个可接受的异常使用。用户可以很容易地错误地输入这些信息,用户的输入无论如何都应该得到验证


例外情况应为“例外”。一些你不期望发生、不应该发生或真的不想发生的事情。任何在需要抛出异常之前都可以被验证或处理的东西都应该被当作一个错误对待。

< P>我不认为第一个例子是一个可接受的异常使用。用户可以很容易地错误地输入这些信息,用户的输入无论如何都应该得到验证


例外情况应为“例外”。一些你不期望发生、不应该发生或真的不想发生的事情。在需要抛出异常之前可以验证或处理的任何内容都应该被视为错误。

不同的社区在可接受的异常使用方面存在差异。Python社区对异常的使用更为自由:


我非常喜欢使用它们,只要它不会破坏应用程序的逻辑。

不同的社区在可接受的异常使用方面有所不同。Python社区对异常的使用更为自由:


只要不破坏应用程序的逻辑,我就喜欢使用它们。

只是想为asp.net添加一个全局异常处理程序HttpModule来捕获未处理的异常,这是一个非常干净的方法,可以训练自己避免try/catch/finally滥用。

只是想为asp.net添加一个全局异常处理程序HttpModule捕获未处理的异常是一种非常干净的方法,可以训练自己避免try/catch/finally滥用。

当您的方法所承担的假设被破坏时,或者如果一个方法根本无法完成时,抛出异常

在您的示例中,IdAlreadyExists方法可能会查询数据库。该方法将假定有一个要连接的数据库,您有足够的内存来执行所需的操作,等等。如果一个假设被打破,抛出一个异常


一、 首先,我喜欢让低级代码抛出异常,让高级代码捕获异常。这不是一条硬性规定,只是我喜欢遵循的一般准则。通常不需要将异常抛出到同一级别,但我可以想象,有时抛出异常是有意义的。

当您的方法所采用的假设被打破时,或者如果一个方法根本无法完成时,抛出异常

still missing the way it SHOULD be done
在您的示例中,IdAlreadyExists方法可能会查询数据库。该方法将假定有一个要连接的数据库,您有足够的内存来执行所需的操作,等等。如果一个假设被打破,抛出一个异常

一、 首先,我喜欢让低级代码抛出异常,让高级代码捕获异常。这不是一条硬性规定,只是我喜欢遵循的一般准则。通常不需要将异常抛出到同一级别,但我可以想象这有时是有意义的

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 
} 
设置错误表并返回

记录错误并不向用户显示

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 
} 

@Dan:请注意.NET异常的设计和优化是为了在异常情况下使用。以非设计的方式使用框架是错误的。@Dan:请注意,.NET异常的设计和优化是为了在异常情况下使用。以非设计的方式使用框架是错误的。似乎你们中的大多数人都反对这种做法,但我仍然不知道应该怎么做。使用异常从BL传递消息真的很容易,但是没有异常我怎么做呢?我是否传递一个字符串,如果出现错误消息,该字符串将保存错误消息,然后在UI中设置ErrorLine(myMessage)?尽管如此,try{do_bl_stuff();}catch(Exception ex){SetError(ex.message);}的模型似乎最简单,实际上也是最干净的。你能给percise举个例子说明你将如何做吗?为什么你会使用tryparse并抛出异常,而不是简单地使用parse并允许.net抛出异常本身?第二步,我将按照预期的方式使用ID,并检查executeNonQuery()以查看是否有许多行被占用