Существует ли путь, как получить в настоящее время вызванную исключительную ситуацию (если существует)?
Я хотел бы, уменьшают объем кода и применяются, некоторое повторное использование для задачи похоже:
Exception thrownException = null;
try {
// some code with 3rd party classes, which can throw unexpected exceptions
}
catch( Exception exc ) {
thrownException = exc;
LogException( exc );
}
finally {
if ( null == thrownException ) {
// some code
}
else {
// some code
}
}
и замените его этим кодом:
using( ExceptionHelper.LogException() ) {
// some code with 3rd party classes, which can throw unexpected exceptions
}
using( new ExceptionHelper { ExceptionAction = ()=> /*some cleaning code*/ } ) {
// some code with 3rd party classes, which can throw unexpected exceptions
}
public class ExceptiohHelper : IDisposable {
public static ExceptionHelper LogException() {
return new ExceptionHelper();
}
public Action SuccessfulAction {get; set;}
public Action ExceptionAction {get; set;}
public void Dispose() {
Action action;
Exception thrownException = TheMethodIDontKnow();
if ( null != thrownException ) {
LogException( thrownException );
action = this.ExceptionAction;
}
else {
action = this.SuccessfulAction;
}
if ( null != action ) {
action();
}
}
}
Действительно ли этот сценарий возможен?
Спасибо
Что ты думаешь о следующем. Вместо того, чтобы смотреть на проблему как, "Как получить последнее исключение?", что, если вы изменяете его на, "Как я выполняю некоторую часть кода еще с некоторым управлением?"
, Например: Вместо ExceptionHelper у вас мог быть ActionRunner.
public class ActionRunner
{
public Action AttemptAction { get; set; }
public Action SuccessfulAction { get; set; }
public Action ExceptionAction { get; set; }
public void RunAction()
{
try
{
AttemptAction();
SuccessfulAction();
}
catch (Exception ex)
{
LogException(ex);
ExceptionAction();
}
}
private void LogException(Exception thrownException) { /* log here... */ }
}
Это, по крайней мере, дало бы вам некоторое повторное использование SuccessfulAction и ExceptionAction, предполагающего, что только AttemptAction варьируется между вызовами.
var actionRunner = new ActionRunner
{
AttemptAction = () =>
{
Console.WriteLine("Going to throw...");
throw new Exception("Just throwing");
},
ExceptionAction = () => Console.WriteLine("ExceptionAction"),
SuccessfulAction = () => Console.WriteLine("SuccessfulAction"),
};
actionRunner.RunAction();
actionRunner.AttemptAction = () => Console.WriteLine("Running some other code...");
actionRunner.RunAction();
Оставить «заднюю дверь», которая позволяет другому классу друзей/функции построить объект способом, запрещенным для пользователя. В качестве примера можно привести контейнер, создающий итератор (C++):
Iterator Container::begin() { return Iterator(this->beginPtr_); }
// Iterator(pointer_type p) constructor is private,
// and Container is a friend of Iterator.
-121--2031702- Может быть не полезен в данный момент, но .Net 4 имеет класс SortedSet в BCL.
-121--3677837-Если вы хотите найти неожиданные исключения, вы должны обработать UnhandLedException . Вы должны ловить исключения только на более низких уровнях, которые вы намерены обрабатывать (не только для регистрации), в противном случае вы должны позволить им пузырь вверх и быть пойманы на более высоком уровне, или, как я упоминал ранее в методе UnhandledException.
Идея в том, что вы обрабатываете исключения в блоке catch...
Тем не менее, Exception - это ссылочный тип, так что вы всегда можете объявить переменную Exception вне области видимости try...
Exception dontDoThis;
try
{
foo.DoSomething();
}
catch(Exception e)
{
dontDoThis = e;
}
finally
{
// use dontDoThis...
}