Как избавиться от выгоды попытки?

В качестве альтернативы

    Dim RefDate1 As Date
    With  Sheets("Monthly Status")  'use with to save retyping
        RefDate1 =.Range("K36")
        If RefDate1 = False Then
            .Range("K24:K34").ClearContents

        Else
          Dim v
          v = Array(26, 26, 23, 22, 20, 20, 19, 12, 11, 9, 8, 6)   'set up an array

          Dim x  'and a counter
          With Range("K24")  'start at the top
               For x = 0 To 11  'going down 11 cells
              .Offset(x, 0).Value = (RefDate1 - (7 * v(x)))  'an offset of x rows,zero columns
              Next x
          End With
    End If
    end with
10
задан abalogh 22 June 2011 в 23:32
поделиться

7 ответов

Во-первых, это кажется, что можно использовать попытку/выгоду слишком часто - особенно, если Вы ловите Exception. блоки попытки/выгоды должны быть относительно редкими; если Вы не можете действительно "обработать" исключение, необходимо просто позволить ему пузырь до следующего слоя стека.

Теперь, принятие Вас действительно хочет все эти блоки попытки/выгоды, почему это не опция создать делегата? С анонимными методами и лямбда-выражениями, а также Func/Action делегирует в System пространство имен, существует в основном очень мало работы, чтобы сделать. Вы пишете:

public void SurroundWithTryCatch(Action action)
{
    try
    {
        action();
    }
    catch(Exception ex)
    {
        //something even more boring stuff
    }    
}

и затем Ваш SurroundWithTryCatch(MyMethod) будет хорошо работать, если это не возьмет параматерей.

С другой стороны, если Вы не хотите называть другой метод, просто запишите:

public void MyMethod()
{
    SurroundWithTryCatch(() => 
    {
        // Logic here
    });
}

Если необходимо возвратиться из метода, можно сделать:

public int MyMethod()
{
    return SurroundWithTryCatch(() => 
    {
        // Logic here
        return 5;
    });
}

с универсальной перегрузкой SurroundWithTryCatch как это:

public T SurroundWithTryCatch<T>(Func<T> func)
{    
    try
    {
        return func();
    }
    catch(Exception ex)
    {
        //something even more boring stuff
    }    
}

Большая часть из этого была бы прекрасна в C# 2 также, но вывод типа не поможет Вам вполне так же, и необходимо будет использовать анонимные методы вместо лямбда-выражений.

Вернуться к запуску хотя: попытайтесь использовать попытку/выгоду менее часто. (попытка/наконец должна быть намного более частой, хотя обычно пишется как оператор использования.)

24
ответ дан 3 December 2019 в 14:18
поделиться

Аспектно-ориентированное программирование могло также помочь Вам, но это может потребовать, чтобы Вы добавили, что библиотеки к Вашему проекту, пострезкому, помогли бы Вам в этом случае. См. эту ссылку http://doc.postsharp.org/1.0/index.html#http://doc.postsharp.org/1.0/UserGuide/Laos/AspectKinds/OnExceptionAspect.html#idHelpTOCNode650988000

4
ответ дан 3 December 2019 в 14:18
поделиться

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

2
ответ дан 3 December 2019 в 14:18
поделиться

Можно попытаться использовать некоторый пустой указатель validiation вместо этого. Я могу взять LINQ к примеру SQL:

var user = db.Users.SingleOrDefault(u => u.Username == 3);

if (user == null)
    throw new ArgumentNullException("User", "User cannot be null.");

// "else" continue your code...
3
ответ дан 3 December 2019 в 14:18
поделиться

Для меня я похож на Вас, просят аспектно-ориентированное программирование. Я думаю, что необходимо смотреть на PostSharp.

2
ответ дан 3 December 2019 в 14:18
поделиться

Я не уверен для C#, но на земле Java Вы могли определить и взаимодействовать через интерфейс со всеми методами и затем скрыть его под объектом прокси. Вы могли убежать с записью еще большего количества кода путем определения чего-то как:

ExceptionCatcher.catchAll(new Runnable() {
  public void run() {
     //run delegate here
     MyMethod();
  }
});

и вместилище () просто назовет выполнимое и переносящийся блоком try-catch вокруг этого.

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

0
ответ дан 3 December 2019 в 14:18
поделиться

При использовании Java у Вас есть RuntimeExceptions, которые являются исключениями, которые означают, что что-то пошло не так, как надо, с которого, как можно ожидать, не восстановитесь. Ищите его. Запустите здесь: http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html

Например, биты Доступа к данным Spring бросают различный RuntimeExceptions, когда вещи идут не так, как надо. Контакт с ними является дополнительным.

0
ответ дан 3 December 2019 в 14:18
поделиться
Другие вопросы по тегам:

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