【问题标题】:How to see what has gone wrong (exception)?如何查看出了什么问题(异常)?
【发布时间】:2012-03-28 19:47:48
【问题描述】:

我正在开发一个打开数据库连接并从中检索数据以显示给用户的应用程序。在我可以看到的代码中,一切看起来都很好,但是由于下面的方法中引发了异常,所以出了点问题。我在“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>

【问题讨论】:

  • 如果在打开连接时抛出异常,我的猜测是连接字符串有问题。通过打开 VS2010 连接对话框并使用该对话框构建字符串来确认连接字符串有效。如果您可以连接,则排除此问题 - 如果您不能,则连接字符串不是有效的,您有答案。

标签: c# asp.net sql exception sqlconnection


【解决方案1】:

您正在捕获各种异常,但根本不使用它们进行分析:

这个:

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

应该是这样的:

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

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

不过,我假设您在那里有 try catch 用于调试目的。如果不是,最好将其完全删除,然后让异常在堆栈中找到它。

【讨论】:

  • ... 但除非您正在调试,否则该信息将会丢失。它不会出现在ApplicationException 中。
  • @Jon 绝对是,我假设他添加了 try catch,因为他正在调试会话中试图找出问题所在。
  • 是的,在这种情况下它会有所帮助——但为什么还要继续抛出这种无信息异常呢?
  • @Jon 我不会,我实际上更改了答案以反映该立场。如果他只是想分析真正的异常,那么抛出一个无用的异常是没有意义的。这完全是因为他首先在没有 try catch 的情况下看到异常时遇到了问题,因为他提到了添加断点。我正在收集他的 VS 实例没有设置为自动捕获异常或类似的东西。
  • 请注意,catch (Exception e) {} 可能会导致编译器警告,因为它引入了未引用的局部变量。相反,使用catch {} 并在调试器中查看$exception
【解决方案2】:

改变

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

throw; 

你会得到实际的异常和消息。

【讨论】:

  • 如果这样做,则根本不需要包含捕获。
  • 确实如此,但这会让你很快得到答案,最后你应该处理异常。因此需要更改的代码行数更少。
  • 嗯,这实际上给了我以下信息: System.InvalidCastException:指定的演员表无效。 - System.Data.SqlClient.SqlBuffer.get_Int32() +5057461 - System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i) +38
  • @JasonCraig,好吧,太好了!现在您知道问题出在哪里,以便您可以解决它。
  • 这是个坏主意 - 最好完全删除 try/catch。 只是“抛出”的 Catch 块只会增加混乱(除非它们针对非常具体的异常做出该行为,而随后的 catch 块将以不同方式处理更一般的异常)。
【解决方案3】:

您的 try/catch 并没有真正做 任何 有用的事情 - 恰恰相反,它正在 删除 信息。

除非您特别期望从此代码 (ick) 中出现 ApplicationException,否则只需完全删除 try/catch,然后让异常冒泡到堆栈顶部。现在您将得到真正的异常,充满了信息性的好处,而不是您当前正在抛出的贫血的“出了点问题,但我真的不知道是什么”异常。

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

【讨论】:

    【解决方案4】:

    您发布的堆栈跟踪实际上告诉您异常,在本例中是一个ApplicationException,它“冒泡”*一个TargetInvocationException

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

    *问题是,你捕获了 proper 异常,然后抛出你自己的异常(实际上不应该抛出但只能派生于创建特定的、自定义的异常类型)被扔掉。)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多