In the try catch block want to get the catch exception code, we know that 404: not found, 400: bad request. In my catch block want to get exception code. How to get exception code in C# catch block.
try
{
await next(context);
}
catch (Exception ex)
{
}
You can just catch the WebException, and then, check the ProtocolError and status code.
}
catch(WebException e) {
if(e.Status == WebExceptionStatus.ProtocolError) {
Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
}
}
catch(Exception e)
{
//
}
Related
In my API, I have over 25 API controllers, in every controller, using the following code to catch exception, I think it is too many code here, any good suggestion for the structure, thanks.
try
{
*code here*
}
catch (UnauthorizedAccessException ex)
{
}
catch (BadRequestException ex)
{
}
catch (HttpRequestException ex)
{
}
catch (TimeoutRejectedException ex)
{
}
catch (FileNotFoundException ex)
{
}
catch (SqlException ex)
{
}
catch (ValidationException ex)
{
}
catch (Exception ex)
{
}
Any simple way to do that.
IF
you plan to handle each exception separately - your approach is the way to go. I suggest to use this "ugly" code simply because it is more readable. If all your exceptions have common handling (for example logging) - you can use only catch (Exception e) and call your logging methods. This will work for all types of exceptions.
OR
If you decide that some of your exceptions might have common handling - you can go with:
try
{
// do
}
catch (Exception e)
{
if (e is BadRequestException ||
e is HttpRequestException ||
e is TimeoutRejectedException )
{
// Log exception
}
}
OR
A good approach is to use a delegate for exception handling. Since you're going to log exceptions, the delegate will handle this.
Action<Exception> HandleError = (e) => {
// Log exception
};
catch (UnauthorizedAccessException e) { HandleError(e); }
catch (BadRequestException e) { HandleError(e); }
catch (HttpRequestException e) { HandleError(e); }
OR
You can combine the first and the second approach
if (e is BadRequestException ||
e is HttpRequestException ||
e is TimeoutRejectedException )
{
HandleError(e);
}
I have a function which has multiple function calls
public async Task Initializer()
{
try
{
await _inject.UpdateFunction();
await _inject.AccountUpdate();
await _inject.InsertData(Args);
}
catch (Exception ex)
{
_logger.Error(" Error:{ex.Message} | {ex.StackTrace}");
throw;
}
}
Here If 1st method calls gets any exception, need to log exception . So decorated with try catch block. I have some parallel calls to other methods inside UpdateFunction
public async Task UpdateFunction()
{
try
{
string sql = "SELECT somedata FROM tblData WHERE deptid = 'Fun-10'";
var lstData = await _dataAccess.QueryAsync<string>(sql);
using SemaphoreSlim maxThread = new SemaphoreSlim(5);
var tasks = lstData.Select(async data =>
{
try
{
await maxThread.WaitAsync();
await GetIds(data);
}
catch (Exception ex)
{
_logger.Error($"Error : {ex.Message} | {ex.StackTrace}");
}
finally
{
maxThread.Release();
}
});
await Task.WhenAll(tasks);
}
catch (Exception ex)
{
_logger.Error($"Error : {ex.Message} | {ex.StackTrace}");
}
}
In this case I got some exception in GetIds(), which is decorated by try catch .
If any of the method throws exception, I need to abort Initializer(). I added try catch in
before tasks and tried,currently inside task added try catch, still not able to abort Initializer().
You can add throw inside the catch block of the UpdateFunction method:
catch (Exception ex)
{
_logger.Error($"Error : {ex.Message} | {ex.StackTrace}");
throw;
}
This way the error will be propagated to the caller of the method.
I'm trying to catch a duplicate key violation. I can see the System.OleDB.OleDBException in the Intellisense pop up, but the inner exception is null. How do I access the Error Code in the System.OleDB.OleDBException?
Greg
try
{
MyData.ConExec(sSQL);
}
catch (Exception ex)
{
OleDbException innerException = ex.InnerException as OleDbException;
if (innerException.ErrorCode == -2147217873)
{
// handle exception here..
}
else
{
throw;
}
}
don't declare an instance of the exception. It will surely return empty if you do.
try
{
MyData.ConExec(sSQL);
}
catch (OleDbException ex)
{
// handle excpetion here...
if (ex.ErrorCode == -2147217873)
{
}
}
catch (Exception e)
{
// if other exception will occur
}
I have this code:
con = new iDB2Connection(connectString);
try { con.Open(); }
catch (iDB2ConnectionTimeoutException ex)
{ Console.WriteLine(ex.Message); }
catch (iDB2DCFunctionErrorException ex)
{ Console.WriteLine(ex.Message); }
catch (AccessViolationException ex)
{ Console.WriteLine(ex.Message); }
Close connection
if (con != null)
{
try
{
Console.WriteLine("CRASH IS AFTER THIS");
if (con.State != ConnectionState.Closed)
{
con.Close();
}
}
catch (iDB2ConnectionTimeoutException ex)
{
Console.WriteLine(ex.Message);
}
catch (iDB2DCFunctionErrorException ex)
{
Console.WriteLine(ex.Message);
}
catch (AccessViolationException ex)
{
Console.WriteLine(ex.Message);
}
catch (iDB2Exception ex)
{
Console.WriteLine(ex.Message);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
}
}
But I still get this nasty message when the Close connection is being run:
Unhandled Exception: IBM.Data.DB2.iSeries.iDB2DCFunctionErrorException: An unexp
ected exception occurred. Type: System.AccessViolationException, Message: Attem
pted to read or write protected memory. This is often an indication that other m
emory is corrupt.. ---> System.AccessViolationException: Attempted to read or wr
ite protected memory. This is often an indication that other memory is corrupt.
at IBM.Data.DB2.iSeries.CwbDc.DcDnIsAlive(Int32 functionNumber, IntPtr connec
tionHandle, IntPtr nullParm)
at IBM.Data.DB2.iSeries.MPConnection.IsAlive()
--- End of inner exception stack trace ---
at IBM.Data.DB2.iSeries.MPConnection.IsAlive()
at IBM.Data.DB2.iSeries.MPConnectionManager.GetConnection(iDB2Connection piDB
2Connection)
at IBM.Data.DB2.iSeries.iDB2Connection.Open()
I get this when I know the iSeries is down for maintenance.
How do I handle this so that the C# console application continues on?
Why don't you put it in the Finally block and use only one try/catch?
con = new iDB2Connection(connectString);
try
{
con.Open();
}
catch (iDB2ConnectionTimeoutException ex)
{
Console.WriteLine(ex.Message);
}
catch (iDB2DCFunctionErrorException ex)
{
Console.WriteLine(ex.Message);
}
catch (AccessViolationException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (con != null && con.State == ConnectionState.Open)
con.Close();
}
I dont want to catch some exception. Can I do it somehow?
Can I say something like this:
catch (Exception e BUT not CustomExceptionA)
{
}
?
try
{
// Explosive code
}
catch (CustomExceptionA){ throw; }
catch (Exception ex)
{
//classic error handling
}
try
{
}
catch (Exception ex)
{
if (ex is CustomExceptionA)
{
throw;
}
else
{
// handle
}
}
Starting with C# 6, you can use an exception filter:
try
{
// Do work
}
catch (Exception e) when (!(e is CustomExceptionA))
{
// Catch anything but CustomExceptionA
}
You can filter it:
if (e is CustomExceptionA) throw;
And of course you can catch it and rethrow it:
try
{
}
catch (CustomExceptionA) { throw; }
catch (Exception ex) { ... }
First off, it's bad practice to catch Exception unless you log and re-throw it. But if you must, you need to catch your custom exception and re-throw it like so:
try
{
}
catch (CustomExceptionA custome)
{
throw custome;
}
catch (Exception e)
{
// Do something that hopefully re-throw's e
}
After being schooled by #Servy in the comments, I thought of a solution that'll let you do [what I think] you want to do. Let's create a method IgnoreExceptionsFor() that looks like this:
public void PreventExceptionsFor(Action actionToRun())
{
try
{
actionToRun();
}
catch
{}
}
This can then be called like this:
try
{
//lots of other stuff
PreventExceptionsFor(() => MethodThatCausesTheExceptionYouWantToIgnore());
//other stuff
}
catch(Exception e)
{
//do whatever
}
That way, every line except for the one with PreventExceptionsFor() will throw exceptions normally, while the one inside PreventExceptionsFor() will get quietly passed over.