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

这工作正常。但我想知道我们可以在不使用try catch某些东西的情况下处理异常if else吗?或者使用try catch.

4

8 回答 8

6

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

if(connection.DidAnErrorOccur)

但这不存在。

于 2012-04-24T18:55:02.947 回答
4

好的,您可以在 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/

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

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

于 2014-11-12T16:51:51.157 回答
3

唯一的方法是检查所有会返回错误的条件。无论如何,你应该这样做。尝试/捕获是昂贵的。Try catch 应该是最后的手段,为此目的没有办法绕过它。

于 2012-04-24T18:55:48.713 回答
2

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

于 2012-04-24T19:16:26.397 回答
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");
     }
}
于 2012-04-24T19:08:05.360 回答
0

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

于 2012-04-24T20:47:11.580 回答
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);
    }
}
于 2014-05-13T22:39:32.863 回答
0

在 .NET core 3.1(或之前?)中,您可以为未处理的异常设置全局捕获器。但是,之后APP将无法继续运行。

这是一个例子:

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

于 2020-04-27T12:14:46.310 回答