.NET - Строки трассировки стека исключений стерты в универсальных методах - PullRequest
0 голосов
/ 24 февраля 2012

(исходное содержание отредактировано, потому что я обнаружил, что оно не имеет значения)

В моем приложении есть универсальный HTTP-клиент RESTful, который переносит операции в делегирует и проходит мимо моего метода WrapOperation (как показано ниже).

Однако, когда возбуждаются исключения, трассировка стека содержит только одну запись:

at MyProject.Client.RestClient.WrapOperation[T](String method, String path, Object requestObject, RestOperation`1 action) in D:\{fileName}\RestClient.cs:line 196

Я сократил код проблемы до следующего:

private T WrapOperation<T>(String method, String path, Object requestObject, RestOperation<T> action) {

        HttpWebRequest request;
        RestTransaction txn = CreateRequest(method, path, requestObject, out request);

        ////////////////////////////

        try {

            throw new WebException("testing stack trace 6");
            throw new Exception("testing stack trace 7");

            using(HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {

                txn.GotResponse( response );

                return action( txn, response );
            }

        } catch(WebException wex) {
            // NOTE: When exceptions are caught, they're missing the first few entries of the stack trace
            // And appear as though "WrapOperation[T]" (sic) is the entrypoint. Why is this?


            if( wex.Response != null ) {

                HttpWebResponse response = (HttpWebResponse)wex.Response;

                txn.GotResponse( wex, response );

                CopyResponseToMemoryStream( response, txn ).Dispose();

            } else {

                txn.GotResponse( wex );
            }

            // NOTE: However, when these RestExceptions are caught (by WrapOperation's caller), their stack trace is complete and shows the entire trace
            throw new RestException("WebExeption during GetResponse.", txn, wex );

        } catch(Exception ex) {

            txn.GotResponse( ex );

            // NOTE: However, when these RestExceptions are caught (by WrapOperation's caller), their stack trace is complete and shows the entire trace
            throw new RestException("Non-WebException during GetResponse.", txn, ex );
        }

    }

Когда выдается исключение «трассировка стека 6», при перехвате перехвата (WebException Wex) трассировка стека Wex содержит только одну запись.

Почему это?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2012

Если один из ваших (не показанных) методов перехватывает исключение, а затем перебрасывает его следующим образом:

throw ex;

Тогда трассировка стека будет сброшена для запуска в точке переброса.

throw;

Будет поддерживать трассировку стека.

0 голосов
/ 24 февраля 2012

Похоже, вы заключили оригинальное исключение в пользовательский класс исключений.Когда вы читаете исключение, чтобы посмотреть на трассировку стека, вам также придется изучить внутреннюю строку исключения, чтобы получить полную трассировку.

edit -

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

Каждый раз, когда вы вызываете новое исключение, трассировка стека для этого исключения начинается в этой точке.

В вашем исходном примере снова рассмотрите внутреннее исключение здесь:

//throwing the exception resets the stack trace!
//the next catch will see the exception as coming from this line, and
//will need to look at the inner exception at that point to see the
//original exception! I Think! I have no idea what RestException is,
//only that your passing the original exception ex into it as a parameter.
throw new RestException("Non-WebException during GetResponse.", txn, ex );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...