10.1.2.4. Сравнение обработчиков событий VBA или VB с .Net

Источник здесь. [перевод не проверен] ;[Переводчик: Богданов Михаил]

    Обработка ошибок в VBA или VB сделана с использованием оператора On Error. Оператор On Error может быть использован в VB.NET без проблем, но вместо него рекомендуется использовать оператор Try. Оператор Try более гибкий, чем выражения On Error Resume Next и On Error GoTo Label.

    Выражения с On Error Resume Next и On Error GoTo label могут быть переписаны с использованием операторов Try-Catch. Ниже показано, как On Error GoTo Label может быть заменен оператором Try-Catch (прим. переводчика точный перевод: переписан с использованием Try-Catch).

On Error - VBA

   1:  Sub ColorEntities()
   2:   
   3:      On Error GoTo MyErrorHandler
   4:   
   5:      Dim entry As Object
   6:   
   7:      For Each entry In ThisDrawing.ModelSpace
   8:          entry.color = acRed
   9:      Next entry
  10:   
  11:      ' Внимание! Выход из подпрограммы до обработчика ошибок
  12:    Exit Sub
  13:   
  14:  MyErrorHandler:
  15:   
  16:      MsgBox entry.EntityName + " is on a locked layer." + _
  17:                                " The handle is: " + entry.Handle
  18:      Resume Next
  19:   
  20:  End Sub

Try-Catch - VB.NET

   1:  <CommandMethod("ColorEntities")> _
   2:   
   3:  Public Sub ColorEntities()
   4:    '' Получить текущий документ и базы данных, и начать транзакцию
   5:   
   6:    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
   7:    Dim acCurDb As Database = acDoc.Database
   8:   
   9:    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  10:   
  11:        '' Открыть блок записи таблицы(прим. преводчика table record) для чтения  
  12:        Dim acBlkTbl As BlockTable
  13:   
  14:        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, _
  15:                                     OpenMode.ForRead)
  16:   
  17:        '' Открыть блок записи таблицы(прим. преводчика table record) в простарнстве модели для чтения 
  18:        Dim acBlkTblRec As BlockTableRecord
  19:   
  20:        acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
  21:                                        OpenMode.ForRead)
  22:        Dim acObjId As ObjectId
  23:   
  24:        '' Перебираем все объекты в пространстве модели
  25:        For Each acObjId In acBlkTblRec
  26:   
  27:            Try
  28:                Dim acEnt As Entity
  29:                acEnt = acTrans.GetObject(acObjId, _
  30:                                          OpenMode.ForWrite)
  31:                acEnt.ColorIndex = 1
  32:            Catch
  33:                Application.ShowAlertDialog(acObjId.ObjectClass.DxfName & _
  34:                                            " расположен на заблокированном слое." & _
  35:                                            " Хэндл (handle): " & acObjId.Handle.ToString())
  36:   
  37:            End Try
  38:        Next
  39:   
  40:        acTrans.Commit()
  41:    End Using
  42:   
  43:  End Sub

Comments