Ser lançado em exceção em finalmente bloqueio
-
20-09-2019 - |
Pergunta
Existe uma maneira, como ser lançado no momento (se existe)?
Eu gostaria de reduzir a quantidade de código e aplicar alguma reutilização para a tarefa:
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
}
}
e substitua -o por este código:
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();
}
}
}
Este cenário é possível?
Obrigado
Solução
O que você acha do seguinte. Em vez de olhar para o problema como "Como obter a última exceção?", E se você alterar para: "Como faço para executar algum código com mais controle?"
Por exemplo: em vez de uma exceção, você pode ter um 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... */ }
}
Isso lhe daria pelo menos alguma reutilização da bem -sucedida e excepção, assumindo que apenas a tentativa varia entre as chamadas.
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();
Outras dicas
A idéia é que você lida com exceções no bloco de captura ...
Dito isto, a exceção é um tipo de referência, para que você sempre possa declarar uma variável de exceção fora do escopo de tentativa ...
Exception dontDoThis;
try
{
foo.DoSomething();
}
catch(Exception e)
{
dontDoThis = e;
}
finally
{
// use dontDoThis...
}
Se você deseja capturar exceções inesperadas, você deve estar lidando com o UNHINDLEDEXCECCECTION. Você só deve capturar exceções em níveis mais baixos que pretende identificar (não apenas para registrar), caso contrário, você deve deixá -los borbulhar e ser capturado em um nível mais alto, ou como mencionei antes no método de UnhleLedException.