В качестве альтернативы
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
Во-первых, это кажется, что можно использовать попытку/выгоду слишком часто - особенно, если Вы ловите 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 также, но вывод типа не поможет Вам вполне так же, и необходимо будет использовать анонимные методы вместо лямбда-выражений.
Вернуться к запуску хотя: попытайтесь использовать попытку/выгоду менее часто. (попытка/наконец должна быть намного более частой, хотя обычно пишется как оператор использования.)
Аспектно-ориентированное программирование могло также помочь Вам, но это может потребовать, чтобы Вы добавили, что библиотеки к Вашему проекту, пострезкому, помогли бы Вам в этом случае. См. эту ссылку http://doc.postsharp.org/1.0/index.html#http://doc.postsharp.org/1.0/UserGuide/Laos/AspectKinds/OnExceptionAspect.html#idHelpTOCNode650988000
Возможно, Вы рассматриваете обработку исключений как коды ошибок через другой синтаксис? Не пробуйте/ловите. Позвольте исключению распространить вверх.
Можно попытаться использовать некоторый пустой указатель 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...
Для меня я похож на Вас, просят аспектно-ориентированное программирование. Я думаю, что необходимо смотреть на PostSharp.
Я не уверен для C#, но на земле Java Вы могли определить и взаимодействовать через интерфейс со всеми методами и затем скрыть его под объектом прокси. Вы могли убежать с записью еще большего количества кода путем определения чего-то как:
ExceptionCatcher.catchAll(new Runnable() {
public void run() {
//run delegate here
MyMethod();
}
});
и вместилище () просто назовет выполнимое и переносящийся блоком try-catch вокруг этого.
Однако я думаю, что Вы действительно хотите, язык, который имеет хорошую поддержку закрытия. Используя закрытия, делая то, что Вы хотите, чрезвычайно легко.
При использовании Java у Вас есть RuntimeExceptions, которые являются исключениями, которые означают, что что-то пошло не так, как надо, с которого, как можно ожидать, не восстановитесь. Ищите его. Запустите здесь: http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html
Например, биты Доступа к данным Spring бросают различный RuntimeExceptions, когда вещи идут не так, как надо. Контакт с ними является дополнительным.