Почему мое исключение не было поймано? - PullRequest
1 голос
/ 17 декабря 2011

У меня есть следующий код.Я заключил его в блок try и "try" для перехвата исключений:

            try
            {
                var response = query.Execute() as QueryOperationResponse;
            }
            catch (System.Net.WebException s)
            {
                var se = e;
                se = se + "aa";
            }
            catch (Exception e)
            {
                var a = e;
                a = a + "ab";
            }

Когда строка query.Execute выполняется, он генерирует исключение, и VS2010 останавливается на строке, начинающейся с catch (System.Net и даетследующее:

System.Data.Services.Client.DataServiceQueryException was unhandled by user code
  Message=An error occurred while processing this request.
  Source=System.Data.Services.Client
  StackTrace:
       at System.Data.Services.Client.DataServiceRequest.Execute[TElement](DataServiceContext context, QueryComponents queryComponents)
       at System.Data.Services.Client.DataServiceQuery`1.Execute()

Когда я перехожу, я ожидаю, что он перейдет к коду «var se = 2;» или «var a = e». Однако следующая строка после того, как я перейду через F11это прыжок полностью из этого блока кода / метода.

Почему исключение не попадает в одну из групп захвата? Я полностью сбит с толку.

Ответы [ 4 ]

4 голосов
/ 17 декабря 2011

DataServiceQuery.Execute () - это асинхронный метод, в котором вам нужно будет либо передать делегат, либо вызвать e.MarkErrorAsHandled (). Позже показано исключение, и оно не находится в том же конвейере выполнения.

И e.Error будет содержать выброшенное исключение.

query.Execute( e=>{
    MessageBox.Show(e.Error.ToString());
    e.MarkErrorAsHandled();
});

или

response = query.Execute();
response.Loaded += e=>{
    MessageBox.Show(e.Error.ToString());
    e.MarkErrorAsHandled();
};

Точные имена должны отличаться, но они будут отображаться на intellisense.

2 голосов
/ 17 декабря 2011

Объявление переменной (например, var se) не является исполняемым оператором, поэтому отладчик не собирается останавливаться на этой строке кода.

Вторая проблема заключается в том, что вы перебрасываете исключение во втором блоке catch. Нет абсолютно никакой причины ловить исключение и затем отбрасывать его. Если вы не собираетесь справиться с этим и просто собираетесь отбросить его, то нет смысла его ловить с самого начала.

Также помните (как упомянул Хенк), когда пошаговый код, что оптимизации могут мешать вещам. Прежде чем пытаться понять последовательность выполнения, убедитесь, что вы создали проект со всеми отключенными оптимизациями.


Кроме того, что вы видите пошаговым кодом в отладчике, почему вы думаете, что не входит в соответствующий блок catch? Я никогда не видел, чтобы код обработки исключений не работал.

Если вы действительно хотите знать, заходите ли вы в один из блоков catch, поместите в блок какой-то тип кода, который имеет видимый эффект. Например, звонок на MessageBox.Show(). Если вы видите окно сообщения, значит, вы оказались внутри блока catch. Если нет, то нет.

Бывают случаи при отладке, когда в окнах сообщений появляются другие побочные эффекты, особенно при написании кода пользовательского интерфейса, но это не один из таких случаев.

0 голосов
/ 22 октября 2013

Если вы хотите поймать исключение, используйте DataServiceQueryException

catch (DataServiceQueryException ex)
 {
ex.Message
}
0 голосов
/ 17 декабря 2011

Вы можете заставить его пошагово проходить, но ваш код действительно должен что-то делать в подвохе.

Например, просто

String t = "Testing";    
t += "Another test";

Это приведет вас туда, где вы сможете хотя бы взглянуть на исключение. Я полагаю, это то, что вы пытаетесь сделать?

...