2013-10-02 2 views
1

Я отлаживаю некоторый код в проекте веб-приложения ASP.net.vb.net if else ошибка логического потока

У меня есть оператор If/Else, вложенный в блок Try/Catch. Всякий раз, когда ошибка возникает внутри блока If, а не сразу переходит в блок Catch, он попадает в блок Else.

Я неоднократно перешагивал код, чтобы засвидетельствовать это. Когда я делаю исключение в блоке if, я ожидаю, что логика перетекает в блок catch, и я бы никогда не ожидал увидеть, что блок if попал, а затем блок else получит удар, который, кажется, полностью лишает цель логика if/else.

Вот код в вопросе:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    LoadDocument() 
End Sub 

Private Sub LoadDocument() 
    Dim taDocuments As New SecureTableAdapters.IndividualDocumentsTableAdapter 
    Dim dtDocuments As New Secure.IndividualDocumentsDataTable 
    Dim iDocumentID As Integer = CInt(Request.QueryString("iDocumentID")) 
    Dim sFileName As String 
    Dim isMac As Boolean = clsApplication.isMac(Request.Browser.Platform) 
    Dim bDownloaded As Boolean = False 

    Try 
     If taDocuments.FillBy_IndividualDocumentID(dtDocuments, iDocumentID) > 0 Then 
      Dim oRow As Secure.IndividualDocumentsRow = dtDocuments.Rows(0) 
      sFileName = "Statement-" & oRow.sFileNumber & ".pdf" 

      If oRow.sDocumentName.ToUpper.Contains("LEDES") Or oRow.sDocumentName.ToUpper.Contains("TEXT") Then 
       sFileName = sFileName.Replace("pdf", "txt") 
      End If 

      Dim b As Byte() = Nothing 

      If oRow.IsbExtractedNull = False AndAlso oRow.bExtracted Then 

       Dim sHost As String = "206.220.201.175" 
       Dim sPath As String = String.Format("/Legacy/{0}/{1}/{2}.pdf", oRow.iFirmID.ToString, "Individuals", oRow.iIndividualDocumentID.ToString) 
       b = DownloadDocument(sHost, sPath) 

       If b Is Nothing Then 
        'When this line is hit, logic jumps to the else block with the comment below 
        Throw New Exception("FTP Download Failed") 
       Else 
        bDownloaded = True 
       End If 
      Else 
       bDownloaded = False 
      End If 

      If bDownloaded = False Then 
       b = getImage(iDocumentID, "oPDF", "iIndividualDocumentID", "tblIndividualDocuments") 
       If b Is Nothing Then 
        Throw New Exception 
       End If 
      End If 

      If isMac Then 
       Response.ContentType = "application/x-macbinary" 
      Else 
       Response.ContentType = "application/octet-stream" 
      End If 

      Response.Expires = 0 
      Response.AddHeader("Content-Disposition", "attachment; filename=""" & sFileName & """") 
      Response.BinaryWrite(b) 
     Else 
      '--->When the exception occurs, logic jumps to this else block 
      Throw New Exception 
     End If 
    Catch ex As Exception 
     Response.Write("Sorry, that statement could not be located. Please try again, or call us at xxx.xxx.xxxx for further information.") 
     clsApplication.EmailError("An error occurred downloading a statement: " & vbCrLf & ex.Source & vbCrLf & ex.Message & vbCrLf & ex.StackTrace) 

    End Try 

End Sub 

Как это возможно?

+0

У вас отключены оптимизаторы для отладки? – RBarryYoung

+0

RBarryYoung - Нет, и это оказалось проблемой. У меня была полная отладка, а также была включена оптимизация. Я читал, что включение этой опции может вызвать сложную отладку, но я понятия не имел, что это может изменить основной поток логики языка. Если бы это было что-то, что вызвало отладку, это было бы одно, но я обнаружил, что это происходит и при публикации. Таким образом, казалось бы, что оптимизация очень опасна. – Josh

+0

Хорошая работа RBarryYoung. Вы должны опубликовать это как ответ и получить полный кредит :) Я рад слышать, что проблема решена, и я узнал что-то новое :) – Derek

ответ

1

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

+0

Это действительно проблема. При этом следует отметить, что это было не просто похоже на то, что код в блоке else ударялся, когда я был в отладчике, он фактически выполнял эти строки кода. Когда я опубликовал этот код на сервере, без приложенного отладчика, эти строки все еще попадали. Таким образом, казалось бы, оптимизация невероятно опасна, поскольку они могут привести к неправильному выполнению кода при наличии PDB. – Josh

+0

@Josh Я никогда не слышал о внешнем поведении (отличном от производительности), которое влияет на настройку оптимизации. Если true, то это определенно ошибка VS.net и должна быть отправлена ​​в Microsoft. – RBarryYoung

+0

Мне нужно будет выполнить некоторые дополнительные тесты, чтобы быть уверенным, что мой вывод является точным, и опубликует здесь результаты. – Josh

0

Я думаю, что вы, вероятно, ошибочно:

Попробуйте следующее в простой Vb программы .NET WinForms.

Public Class Form1 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
     Try 
     Dim doIt As Boolean = True 
     If doIt Then 
      Throw New Exception("throwing that stuff") 
     Else 
      MsgBox("in here - how did that happen?") 

     End If 
     Catch ex As Exception 
     MsgBox(String.Format("That makes sense. Exception is: {0}", ex)) 
     End Try 


    End Sub 
End Class 
+0

Я, конечно, не ошибаюсь. Помимо того факта, что я развиваюсь с Visual Studio в течение 15 лет, я наблюдаю, как это происходит. Вид трудно принять текущую строку, прыгающую с линии броска на блок else. Я могу записать сценарий этого, если это поможет вам поверить, что то, что я говорю, происходит на самом деле. – Josh

+0

Я поддержал ответ Джеймса Джонсона. То, что вы видите, действительно не может произойти. По крайней мере, я действительно так не думаю. – Derek

+0

Также это веб-приложение, а не приложения winforms. – Josh

1

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

+0

Сделал это. Также выполняются чистые и вручную удаленные папки bin и obj. Все еще бывает. – Josh

Смежные вопросы