我正在开发一个应用程序,该应用程序打开数据库连接并从中检索数据以显示给用户。在我能看到的代码中,一切看起来都很好,但是有些东西是错误的,因为在下面的方法中会抛出异常。我在“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>
答案 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用于调试目的。如果不是,最好完全删除它,让异常发现它在堆栈中。