如何在不使用try catch的情况下处理异常?

时间:2012-04-24 18:52:25

标签: c# exception try-catch sqlconnection

using (SqlConnection con = new SqlConnection())
{
     try
     {
          con.Open();
     }
     catch (Exception ex)
     {
          MessageBox.Show(ex.Message);
     }
}

这很好用。但我想知道我们可以处理异常而不使用try catch之类的东西if else吗?或使用try catch

是否具有贬义作用

8 个答案:

答案 0 :(得分:5)

除了try catch之外,没有其他机制可以处理异常。听起来你想要像

这样的东西
if(connection.DidAnErrorOccur)

但这不存在。

答案 1 :(得分:3)

唯一的方法是检查会返回错误的所有条件。无论如何你应该这样做。尝试/捕获是昂贵的。尝试捕获应该是最后的手段,并且没有办法解决它。

答案 2 :(得分:2)

我能给你的最佳选择是艾玛。 http://code.google.com/p/elmah/ 它将处理所有未被捕获的错误并记录它们。从那里我建议修复所述错误或捕获您期望的特定错误,而不是捕获可能发生的任何错误。最好这样做可以解决潜在问题,而不是简单地跳过代码,因为发生了异常。

答案 3 :(得分:2)

好的,你可以在global.asax 中实现de Application_Error,这个方法是错误的第一道防线,适用于所有应用程序

http://msdn.microsoft.com/en-us/library/24395wz3%28v=vs.100%29.aspx

对于特定页面,例如default.aspx,您可以实现 Page_Error

http://msdn.microsoft.com/en-us/library/ed577840%28v=vs.100%29.aspx

如果你在mvc中工作,那么你可以在你想要的每个控制器中实现 OnException(ExceptionContext filterContext),当发生未处理的异常时会调用此方法。

http://devproconnections.com/aspnet-mvc/aspnet-mvc-tutorial-handling-errors-and-exceptions

或者您可以实施错误属性

https://www.simple-talk.com/dotnet/asp.net/handling-errors-effectively-in-asp.net-mvc/

另一方面也许您可以使用断言语句,这样就可以评估条件

http://msdn.microsoft.com/en-us/library/ttcc4x86.aspx

答案 4 :(得分:1)

Tejs的回答是正确的,我相信没有其他机制来处理错误。

但是,您可以处理更具体的错误。您还可以在try catch之外声明变量,看它是否成功。

示例:

using (SqlConnection con = new SqlConnection())
{
     bool sqlErrorOccurred;

     try
     {
         con.Open();
         sqlErrorOccurred = false;
     }
     catch (SqlException ex)
     {
          sqlErrorOccurred = true;
     }

     if(sqlErrorOccurred)
     {
         MessageBox.Show("A Sql Exception Occurred");
     }
}

答案 5 :(得分:0)

以上答案是正确的。但是,需要注意的另一件事是可以设置全局异常处理程序。这并不能解决前面提到的防御性编码的需要。但是,如果担心需要处理所有异常(例如,记录错误),那么这种方法可能非常有用。

答案 6 :(得分:0)

我正在构建一个使用实时流数据的系统,因此需要处理当其他所有内容都空闲时可能发生的错误。我正在使用的API通过名为“error”的方法将错误传递回程序,附带例外。然后这个方法可以抛出错误,但这是有问题的,因为我无法看到如何将我的整个程序完全放在try-catch块中是个好主意。

因此,为了解决这个问题,我将设置一个事件处理程序来触发程序主要部分中的事件,然后可以处理在该时间点抛出的任何错误。

例如:

在主要课程中:

private void Error(object sender, EventArgs e) {

    Exception ex = sender as Exception;

    Console.WriteLine("Error: " + ex); // Or whatever you want to do with the exception

    // You could even add this if you want to then use the try -catch sequence (which 
    // makes the exception easier to parse and also enables you to stop the program
    // with unhandled exceptions if it's something catastrophic:

    try {

        throw ex;
    } catch (put.your.exception.detail.here) {

        // do stuff
   } finally {

       // do other stuff
   }
}

(在从API接收错误的类中):

class Foo {
    public event EventHandler ThrowError;

    protected virtual void OnError(Object src, EventArgs e) {

        if (ThrowError != null) {

            ThrowError(src, e);
        }
    }

    private virtual void error(Exception e) {

        OnError(e, EventArgs.Empty);
    }
}

答案 7 :(得分:0)

在.NET core 3.1(或更早版本?)中,您可以为未处理的异常设置全局捕获器。但是,此后该APP将不会继续运行。

这里是一个例子:

https://docs.microsoft.com/en-us/dotnet/api/system.appdomain.unhandledexception?redirectedfrom=MSDN&view=netcore-3.1