私はWebAPI
プロジェクトを持っており、try/catch
からキャッチするexception
をexception
filters
に移動しています。以前私がtry/catch
ブロックを使用したとき、私はSQL
コマンドオブジェクトにアクセスして、SQL
コマンドテキストをデータベースに記録することができました。今度は例外フィルタに移りましたので、もはやSQL
コマンドオブジェクトにアクセスすることはできません。私が後にしているのは、最後に実行されたコマンドSQL
を例外フィルタに渡して、まだログできるようにする方法です。ExceptionFilterに値を渡します
前のコード(のtry/catchブロック)
public HttpResponseMessage API([FromBody] int roomID)
{
HttpResponseMessage msg = null;
SqlCommand comm = Common.Shared.ConnectDB();
try
{
List<Models.room> room = room(comm, roomID);
msg = Request.CreateResponse(HttpStatusCode.OK, room);
}
catch (CustomException ex)
{
msg = Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
}
catch (Exception ex)
{
comm.Parameters.Clear();
var sourceFunction = "rooms";
var returnException = Common.Logging.CreateLog(ex, comm, sourceFunction);
msg = Request.CreateResponse(HttpStatusCode.InternalServerError, returnException);
}
finally
{
comm.Connection.Close();
}
return msg;
}
例外フィルタコード
public class InternalServerErrorFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
Log.Error(context.Exception, "Exception Information");
context.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
}
}
コントローラの例外フィルタ
[InternalServerErrorFilter]
[HttpPost]
public HttpResponseMessage API([FromBody] int roomID)
{
HttpResponseMessage msg = null;
SqlCommand comm = Common.Shared.ConnectDB();
try
{
List<Models.room> room = room(comm, roomID);
msg = Request.CreateResponse(HttpStatusCode.OK, room);
}
finally
{
comm.Connection.Close();
}
return msg;
}
これはSQLの例外に対して機能します。しかし、私はまた、SQL例外をスローしないので、私はデータリーダなどで使用されたコマンド文字列を取得しません – Nathan
他の例外のためのSQLコマンドをつかむことを望んでいた@ネイサンあなたは2番目のオプションで行くことができます。ただし、データリーダーによって手動で発生した例外を手動で処理する必要があります。 'SqlException'をキャッチする必要はなく、' Exception'をキャッチすることができます。 –