Как увидеть, что пошло не так (исключение)? - PullRequest
0 голосов
/ 12 марта 2012

Я работаю над приложением, которое открывает соединение с базой данных и извлекает из него данные для показа пользователю. Все выглядит хорошо в коде того, что я вижу, но что-то не так, потому что исключение выдается в методе ниже. Я установил точку останова на "conn.Open ();" и это там исключение.

Я понятия не имею, как выяснить, что на самом деле является ошибкой и как ее исправить, и надеюсь получить здесь некоторую помощь. Трассировку стека для исключения можно найти здесь , если это поможет.

Исключение: 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 ]

5 голосов
/ 12 марта 2012

Ваш try / catch на самом деле не делает ничего полезного - совсем наоборот, он удаляет информацию.

Если вы не специально ожидая ApplicationException от этого кода (ick), просто полностью удалите try / catch и позвольте исключению всплыть на вершину стека.Теперь вы получите реальное исключение, полное информационного совершенства, а не анемичное "Что-то пошло не так, но я действительно понятия не имею, что" исключение вы в настоящее время выбрасываете.Если вы хотите увидеть исключение в отладчике, просто измените настройки отладчика, чтобы включить его, как только возникнет исключение - для этого вам не нужен блок try / catch.

4 голосов
/ 12 марта 2012

Трассировка стека, которую вы публикуете, фактически сообщает вам об исключении, которое в данном случае является ApplicationException, которое «всплыло из» * * * * * * * * * * * * * *

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

* Дело в том, что вы перехватываете правильное исключение, а затем выбрасываете свое собственное исключение (типа, который на самом деле не должен быть выдан, а только получен для создания определенных, пользовательских типов исключений, подходящих для выброшены.)

Между прочим, TargetInvocationException может быть жестким, поскольку статические конструкторы являются виновником, о котором я не забываю, но не знаю вашего кода, я не могу сказать.

3 голосов
/ 12 марта 2012

Изменение

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

до

throw; 

и вы получите фактическое исключение и сообщение.

1 голос
/ 12 марта 2012

Вы ловите все виды исключений и вообще не используете их для анализа:

Это:

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

должно быть так:

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

Теперь переменная e будет иметь всю необходимую вам информацию.

Хотя, я предполагаю, что у вас есть ловушка try для целей отладки.В противном случае было бы лучше просто полностью удалить его и позволить исключению найти путь вверх по стеку.

...