Как повторно включить обработку ошибок по умолчанию в VB6

Вы писали:

Мне нужно сгруппировать их по электронной почте, и из этого мне нужно получить минимальное login_time определенного email_id для текущей даты.

blockquote>

Для этого я бы использовал Queryable.GroupBy с ElementSelector .

DateTime selectionDate = DateTime.UtcNow.Date;  // or any other date you want to use


var result = db.Logs
    // Keep only logs that have an e-mail on the selection date:
    .Where(log => log.LogInTime == selectionDate)

    // Group all remaining logs into logs with same email
    .GroupBy(log => log.email,

    // element selector: I only need the LoginTimes of the Logs
    log => log.LoginTime,

    // result selector: take the email, and all logInTimes of logs 
    // with this email to make a new object
    (email, logInTimesForThisEmail) =>  new
    {
        Email = email, // only if desired in your end result

        // Order the loginTimes and keep the first,
        // which is the min login time of this email on this date
        MinLoginTimeOnDate = logInTimesForThisEmail
            .OrderBy(logInTime => loginTime)
            .FirstOrDefault(),

Ваш пример кода показывает, что вы также хотите максимальное время входа в систему на выбранную дату. Используйте отдельный Select, поэтому вам нужно будет упорядочить элементы только один раз:

(email, logInTimesForThisEmail) =>  new
{
    Email = email, // only if desired in your end result
    LogInTimes = logInTimesForThisEmail
        .OrderBy(loginTime => loginTime);
})
.Select(groupResult => new
{
    Email = groupResult.Email,
    MinTime = groupResult.LogInTimes.FirstOrDefault(),
    MaxTime = groupResult.LogInTimes.LastOrDefault(),
});

Если вам нужно больше полей, чем просто Email и LoginTimes, измените параметр ElementSelector GroupBy, так что он содержит также эти другие поля.

8
задан Yarik 10 November 2011 в 05:16
поделиться

8 ответов

Это подробно объясняется в VB6 руководство по Иерархия обработки ошибок . On Error Goto 0 отключает обработчик ошибок в текущей процедуре , а не в вызывающих ее процедурах.

Если в процедуре возникает ошибка и эта процедура не включена обработчик ошибок, поиск в Visual Basic назад через ожидание процедуры в списке вызовов - и выполняет первый включенный обработчик ошибок он находит. Если оно не обнаружена ошибка обработчик в любом месте списка вызовов, это представляет неожиданную ошибку по умолчанию сообщение и останавливает выполнение.

Как уже говорили другие, вы можете перейти на вкладку Tools-Options-General и выбрать Break на всех ошибках . Это эффективно отключает все ваши операторы On Error - среда IDE немедленно ломается при каждой ошибке.

Это может раздражать, если ваш код VB6 выдает ошибки как часть нормальной работы. Например, когда вы проверяете, существует ли файл, или когда пользователь нажимает кнопку отмены в обычном диалоге. Вы не хотите, чтобы IDE каждый раз ломалась в этих строках. Но у вас могут быть стандартные обработчики ошибок во всех ваших процедурах обработки событий, чтобы предотвратить сбой программы при непредвиденных ошибках. Но они доставляют неудобства, когда вы отлаживаете проблемы, потому что среда IDE не ломается в строке с ошибкой. Одна хитрость заключается в том, чтобы отключить эти обработчики ошибок при работе в IDE, но держите их во встроенном исполняемом файле. Вы делаете это так.

Перетащите эти функции в модуль.

Public Function InIDE() As Boolean 
  Debug.Assert Not TestIDE(InIDE) 
End Function 

Private Function TestIDE(Test As Boolean) As Boolean 
  Test = True 
End Function 

Затем вы можете написать свои обработчики ошибок следующим образом.

Private Sub Form_Load() 
  If Not InIDE() Then On Error Goto PreventCrashes 
  <lots of code> 
  Exit Sub 

PreventCrashes: 
  <report the error> 
End Sub 

Здесь здесь . Другой совет - используйте бесплатную надстройку MZTools для автоматического добавления этих стандартных обработчиков ошибок. Что касается кода производственного качества, вы можете пойти дальше и добавить обработчик ошибок в каждую подпрограмму для создания трассировки стека гетто . Вы также можете сразу регистрировать ошибки в каждом обработчике ошибок.

РЕДАКТИРОВАТЬ: Ant правильно указал, что On Error Goto -1 является оператором VB.Net и не допустимо в VB6.

РЕДАКТИРОВАТЬ: Arvo и OneNerd написали ответы с интересным обсуждением эмуляции, наконец, разделительных блоков в обработке ошибок VB6.

10
ответ дан 5 December 2019 в 11:27
поделиться

Существует простой и понятный способ сброса состояния ошибки - используйте ключевое слово Resume. Существует три возможности:

Resume
Resume Next
Resume <Label>

Resume продолжает выполнение в строке с ошибкой, Resume Next в следующей строке и наименее обсуждаемая метка Resume продолжается в метке. Очень полезно для создания конструкций типа try-catch-finally в VB6. Заимствовано и изменено из ответа OneNerd:

Function MyFunction() as String

'-- start of error block
'
 On Error Goto Catch
   ' do something here that might cause an error
   MyFunction = "IT WORKED"
   Goto Finally

   Catch:
   ' error occured - do something else
   MyFunction = Err.Description
   Err.Clear
   Resume Finally          ''added to clear error status

 Finally:
   On Error Resume Next    ''added to avoid repeated errors
   ' put your finally code here

 '
 '-- end of error block

End Function

Простой Err.Clear не помогает, если в блоке «Наконец» возникает какая-то последующая ошибка; Resume Наконец сбрасывает состояние внутренней ошибки.

3
ответ дан 5 December 2019 в 11:27
поделиться

Есть удобное контекстное меню, которое позволяет включать и выключать обработку ошибок. Просто щелкните правой кнопкой мыши на окне кода и выберите Toggle, затем вы можете выбрать «Разбить все ошибки». Это приведет к отключению всех ваших операторов «On Error».

1
ответ дан 5 December 2019 в 11:27
поделиться

Вот что я делаю:

Сначала включите обработку ошибок, как это, если необходимо, в вашем Sub Main () или Sub Form_Load () Sub:

'-- turn on error handling
'
On Error GoTo 0
'
'-------------------------

Теперь ошибки будут включены.

Далее, используйте On Error Resume Next и При ошибке Команды GoTo {label} в сочетании с объектом Err . Вот пример эмуляции try / catch / finally:

Function MyFunction() as String

'-- start of error block
'
 On Error Goto Catch
   ' do something here that might cause an error
   MyFunction = "IT WORKED"
   Goto Finally

   Catch:
   ' error occured - do something else
   MyFunction = Err.Description
   Err.Clear

 Finally:
   ' put your finally code here

 '
 '-- end of error block

End Function
1
ответ дан 5 December 2019 в 11:27
поделиться

/ Инструменты / Параметры / Общие / Обработка ошибок

0
ответ дан 5 December 2019 в 11:27
поделиться
on error goto 0

Должно быть то, что вы хотите ... Это должно вызвать ошибку к броску, и в свою очередь, вероятно, раскрутить до RTL ...

Это было давно, но я уверен, что это то, что вы хотите.

on error resume next

просто перейдет к следующему утверждению, поэтому вам НУЖНО иметь в своем коде множество операторов

if err.Number <> 0 then

где ошибки МОГУТ произойти ...

0
ответ дан 5 December 2019 в 11:27
поделиться

Необходимо согласиться с LarryF, При ошибке Перейти к 0 следует отключить явную обработку ошибок, которая был включен On Error Resume Next . Хотя функции и подпрограммы имеют свои собственные возможности для этого. От д-р. Скрипт в Microsoft :

Возобновление ошибки при следующем на начало сценария, как мы часто делает, это относится ко всему телу сценария. Но, как мы увидим в более поздние примеры, его объем не включить функции или подпрограммы. Если вы хотите обрабатывать ошибки в функция или подпрограмма, вы также должны включить по ошибке возобновить далее в каждом из них перед проверкой Err объект.

Вы можете отключить обработку ошибок с помощью При ошибке GoTo 0. Так что возможно включить обработку ошибок с помощью On Error Возобновить Далее, прежде чем вы хотите проверьте объект Err и выключите его после с On Error GoTo 0.

0
ответ дан 5 December 2019 в 11:27
поделиться

There is no "On Error GoTo -1" so I have no idea where you got that.

VB6 exception handling is covered very thoroughly in the manual.

0
ответ дан 5 December 2019 в 11:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: