如何查看出错的地方(例外)?

时间:2012-03-12 11:58:37

标签: c# asp.net sql exception sqlconnection

我正在开发一个应用程序,该应用程序打开数据库连接并从中检索数据以显示给用户。在我能看到的代码中,一切看起来都很好,但是有些东西是错误的,因为在下面的方法中会抛出异常。我在“conn.Open();”处设置了一个断点。它就在那里抛出异常。

我不知道如何找出实际错误是什么以及如何解决它,并希望在这里得到一些帮助。如果有异常,可以找到异常的堆栈跟踪here

例外是:System.ApplicationException:应用程序中的错误

提前致谢!

抛出异常的方法:

public List<Movie> GetMovies() {

    var movieTitles = new List<Movie>(100);

    using (var conn = CreateConnection()) {
        try {
            var cmd = new SqlCommand("dbo.usp_GetMovies", conn);
            cmd.CommandType = CommandType.StoredProcedure;

            conn.Open();

            using (var reader = cmd.ExecuteReader()) {
                var movieIDIndex = reader.GetOrdinal("MovieID");
                var nameIndex = reader.GetOrdinal("Name");
                var yearIndex = reader.GetOrdinal("Year");
                var lengthIndex = reader.GetOrdinal("Length");
                var summaryIndex = reader.GetOrdinal("Summary");

                while (reader.Read()) {
                    movieTitles.Add(new Movie {
                        MovieID = reader.GetInt32(movieIDIndex),
                        Name = reader.GetString(nameIndex),
                        Year = reader.GetInt32(yearIndex),
                        Length = reader.GetInt32(lengthIndex),
                        Summary = reader.GetString(summaryIndex),
                    });
                }
            }
        }
        catch {
            throw new ApplicationException("An error occured!");
        }

    }

    movieTitles.TrimExcess();

    return movieTitles;
}

继承包含上述方法的类的基类:

public abstract class DALBase {
    private static string _connectionString;

    static DALBase() {
            _connectionString = WebConfigurationManager.ConnectionStrings["NameOfTheDatabase_ConnectionString"].ConnectionString;
    }

    protected SqlConnection CreateConnection() {
        return new SqlConnection(_connectionString);
    }
}

来自web.config:

  <connectionStrings>
    <add name="NameOfTheDatabase_ConnectionString" connectionString="Data Source=xxx.xx.xxx.x;Initial Catalog=The_Catalog;User ID=xxxxxx;Password=xxxxxx" providerName="System.Data.SqlClient"/>
  </connectionStrings>

4 个答案:

答案 0 :(得分:5)

你的try / catch并没有真正做任何有用的东西 - 恰恰相反,它是删除信息。

除非你特别期待ApplicationException来自此代码(ick),否则只需完全删除try / catch,然后让异常冒泡到堆栈顶部。现在你将获得真正的异常,充满了信息良善,而不是贫血的“出了问题,但我真的不知道你现在正在抛出什么”。

如果你想在调试器中看到异常,只需更改调试器设置就会在出现异常时立即中断 - 你不需要try / catch块。

答案 1 :(得分:4)

您发布的堆栈跟踪实际上会告诉您异常,在这种情况下是ApplicationException,它从'TargetInvocationException开始冒泡:

TargetInvocationException: Exception has been thrown by the target of an invocation.

*问题是,您捕获正确的异常,然后抛出您自己的异常(不应该实际抛出的类型,但只是派生自创建特定的自定义异常类型)被抛出。)

顺便说一句,TargetInvocationException可能很难确定,静态构造函数是我要记住的罪魁祸首,但不知道你不能说的代码。

答案 2 :(得分:3)

更改

throw new ApplicationException("An error occured!"); 

throw; 

您将获得实际的异常和消息。

答案 3 :(得分:1)

你正在捕捉各种异常而根本不使用它们进行分析:

此:

catch 
{
    throw new ApplicationException("An error occured!");
}

应该是这样的:

catch (Exception e) 
{
    //look at e here
}

现在,e变量将包含您需要的所有信息。

虽然,我假设你有try catch用于调试目的。如果不是,最好完全删除它,让异常发现它在堆栈中。