Error Trapping Best Method - c#

Hi I am trying to get a list of all trouble tickets but it says that not all codes paths return a value. Does Anybody no what I am doing wrong thanks
public List<TroubleTicket> GetAllTroubleTickets()
{
try
{
List<TroubleTicket> tickets = new List<TroubleTicket>();
var q = _supportDeskEntities.TroubleTickets.ToList();
return q;
}
catch (Exception ex)
{
}
}

If you catch an exception the function returns no value. So change this:
catch (Exception ex)
{
}
To this:
catch (Exception ex)
{
return null;
}
Or if you want it to return an empty list when an exception is catch then you can do this:
catch (Exception ex)
{
return new List<TroubleTicket>(0);
}
If we are taking about best practice then I would say that you should log the exception and then re-throw it. Like this:
catch (Exception ex)
{
//write to log
throw ex;
}

You need to return a value from the catch statement (or throw another exception within it). Otherwise, the function will return null
You can try this:
public List<TroubleTicket> GetAllTroubleTickets()
{
try
{
List<TroubleTicket> tickets = new List<TroubleTicket>();
var q = _supportDeskEntities.TroubleTickets.ToList();
return q;
}
catch (Exception ex)
{
return new List<TroubleTicket>(); // This is just in case you want to ignore any exceptions
}
}
or
catch (Exception ex)
{
throw new Exception("There was an error getting tickets"); // Probably not as good of a way as you lose the exception details
}

You only return a value if there is no exception thrown. You must either return from inside the catch block, or return outside the try/catch structure.
So you can either return in two separate places:
public List<TroubleTicket> GetAllTroubleTickets()
{
try
{
var q = _supportDeskEntities.TroubleTickets.ToList();
return q;
}
catch (Exception ex)
{
// You can also return "new List<TroubleTicket>()" if null is an unacceptable return value
return null;
}
}
or keep a return value variable, and set it in two different locations, and return it in one location:
public List<TroubleTicket> GetAllTroubleTickets()
{
List<TroubleTicket> tickets;
try
{
tickets = _supportDeskEntities.TroubleTickets.ToList();
}
catch (Exception ex)
{
// You can also use "new List<TroubleTicket>()" if null is an unacceptable return value
tickets = null;
}
return tickets;
}

You're not returning anything if an exception happens and you're not assigning the list to List<TroubleTicket> tickets but to a different variable. You could do:
public List<TroubleTicket> GetAllTroubleTickets()
{
List<TroubleTicket> tickets = null;
bool gotTickets = true;
try{
tickets = _supportDeskEntities.TroubleTickets.ToList();
}
catch (SpecificException ex){
gotTickets = false;
}
catch (Exception ex){ // catches all other "unexpected" exceptions
// log and/or...
throw;
}
return gotTickets ? tickets : null;
}
But you should not catch all kind of exceptions but only specific types that you expect. You also should log all other types of exceptions.

Your catch block is not returning anything.
public List<TroubleTicket> GetAllTroubleTickets()
{
List<TroubleTicket> tickets =null;
try
{
tickets = new List<TroubleTicket>();
var q = _supportDeskEntities.TroubleTickets.ToList();
return q;
}
catch (Exception ex)
{
//Log or handle your error
}
return tickets;
}

Related

What value should I return in catch?

I just implemented a Try catch in my code, the error is because I have to return something in the catch,
I can't understand is "what should I return?"
'CompanyController.Create(DtoCompany)': not all code paths return a
value [API]
[HttpPost("create/")]
public async Task<ActionResult> Create([FromBody] DtoCompany dto_company)
{
try
{
var query = context.Companies.FirstOrDefault(x => x.rnc == dto_company.rnc);
if (query != null)
{
Company comp = mapper.Map<Company>(query);
context.Add(comp);
await context.SaveChangesAsync();
return Ok("Registro de compania exitoso");
}
else
{
return BadRequest($"Ya existe una compaƱia con este RNC: `{dto_company.rnc}`");
}
}
catch (Exception ex)
{
Console.WriteLine("Error From Company-Create:", ex.Message);
}
}
If I write the return this, I getting an other error:
catch (Exception ex)
{
return Console.WriteLine("Error From Company-Create:", ex.Message);
}
Cannot implicitly convert type 'void' to
'Microsoft.AspNetCore.Mvc.ActionResult' [API]
You should return an error telling your client what went wrong.
A good way to to this is to return Problem().
https://learn.microsoft.com/en-us/aspnet/core/web-api/handle-errors?view=aspnetcore-6.0
'CompanyController.Create(DtoCompany)': not all code paths return a
value [API]
I can't understand is "what should I return?"
If in the try block there's already a return statement, you could put the other return at the end of the function, and this in order to avoid multiple returns if multiple exceptions need to be handled:
try
{
//somecode
return Ok();
}
catch(Exception ex)
{
Console.WriteLine("Error From Company-Create:", ex.Message);
}
return BadRequest();// add this code
You shouldn't return anything from the catch part just a MessageBox or Console.WriteLine which you implemented on the first block...
Simply try catch statement is to ask compiler to do something and if any error occurred in the code simply catch it and show it me using a MessageBox or Console.WriteLine
Example:
try
{
sqlConnection conn = new sqlConnection(connection_string);
conn.Open();
}
catch (Exception ex)
{
if (ex.Message == "Certain specific error")
MessageBox.Show("Do not do it");
else
MessageBox.Show("Please do not do it");

Inexplicable NullReferenceException that only occurs in production

We have an ASP.NET website running which throws a NullReference-exception along with a stacktrace and a line number that is simply impossible. And I can't make heads nor tails from it myself.
It says:
Exception at ReportService.GetReport(String reportType) in ReportService.cs:line 1458
which is funny, because that is this line:
var exports = new List<ReportExport>();
Thanks to the (very short) stacktrace, I can see that the error is triggered in the GetReport-function and not in the "GetAllUsers" or "GetAllUsersWithFilter" functions, because I would receive a different error message in my e-mailbox or I would see it pop up in the stacktrace.
So I suspect the line number is wrong, in which case there is only one other possibility and that is this line:
foreach (var userProfile in users) {
exports.Add(CreateUserProfile(userProfile));
}
But how could users ever be null?
Full (albeit simplified) code right here:
public function IList<ReportExport> GetReport(string reportType) {
try {
IQueryable<UserProfile> users = null;
switch (reportType) {
case "abc" :
users = GetAllUsersWithFilter();
break;
case default:
users = GetAllUsers();
break;
}
var exports = new List<ReportExport>();
foreach (var userProfile in users) {
exports.Add(CreateUserProfile(userProfile));
}
} catch (Exception ex) {
SendErrorMail("GetReport has failed", ex); /* I receive this error mail */
}
function IQueryable<UserProfile> GetAllUsers() {
try {
return dbContext.Users.Where(x => x.IsRegistered == true);
} catch (Exception ex) {
SendErrorMail("GetAllUsers", ex); /* I don't receive this e-mail */
return null;
}
}
function IQueryable<UserProfile> GetAllUsersWithFilter() {
try {
return GetAllUsers().Where(x => x.ExtraFilter == true);
} catch (Exception ex) {
SendErrorMail("GetAllUsersWithFilter", ex); /* I don't receive this e-mail */
}
}
function int GetNumberOfSessions(int userId) {
try {
return dbContext.Sessions.Count(x => x.UserId == userId);
} catch (Exception ex) {
SendErrorMail("GetNumberOfSessions", ex); /* I don't receive this e-mail */
}
}
function ReportExport CreateUserExport(UserProfile user) {
try {
var cnt = GetNumberOfSessions(user.Id);
return new ReportExport() {
UserId = user.Id,
NumberOfSessions = cnt
}
} catch (Exception ex) {
SendErrorMail(("CreateUserExport", ex);
}
}
If you are in production then you might be running with optimizations switched on - therefore the line number will be wrong.
But how could users ever be null?
But you are catching the Exception then returning null. You are relying on returning data - which may not be the case in GetAllUsers.
function IQueryable<UserProfile> GetAllUsers() {
try {
return dbContext.Users.Where(x => x.IsRegistered == true);
} catch (Exception ex) {
SendErrorMail("GetAllUsers", ex); /* I don't receive this e-mail */
return null;
}
}

Try Catch Exceptions Error

When I use try catch exception with this piece of code, I get the following error:
"not all code paths return values"
My code:
public System.Drawing.Image Scan()
{
try
{
const string formatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
WIA.CommonDialog scanDialog = new WIA.CommonDialog();
WIA.ImageFile imageFile = null;
imageFile = scanDialog.ShowAcquireImage(WIA.WiaDeviceType.ScannerDeviceType, WIA.WiaImageIntent.GrayscaleIntent,
WIA.WiaImageBias.MinimizeSize, formatJPEG, false, true, false);
WIA.Vector vector = imageFile.FileData;
System.Drawing.Image i = System.Drawing.Image.FromStream(new System.IO.MemoryStream((byte[])vector.get_BinaryData()));
return i;
}
catch (COMException ce)
{
if ((uint)ce.ErrorCode == 0x800A03EC)
{
return ce;
}
}
Change your catch block like below will work but still you face some issue. Because your method returns type Image and you are returning COMException in catch block. I suggest you to throw the exception or Log in catch block
if ((uint)ce.ErrorCode == 0x800A03EC)
{
//DO LOGGING;
}
else
{
throw ce;
}
You have two different problems here. First, your catch block won't return anything if the condition is not met. Second, the return type within the catch block is not the same as the one inside of the try block.
You probably want something more like this in your catch block:
catch (COMException ce)
{
if ((uint)ce.ErrorCode == 0x800A03EC)
return null; // Don't return anything if a specific code was found
throw ce; // Rethrow the exception for all other issues.
}

Not all code paths return a value sql

Error :'WinWithStudentDatabase.Broker.FillComboBox()': not all code
paths return a value.
I know what that error means but can not figure out why its not working :/ ... this is my code:
public List<Person> FillComboBox()
{
List<Person> personsList = new List<Person>();
try
{
string sql = "SELECT * FROM Tperson";
cmd = new SqlCommand(sql, connection);
connection.Open();
System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read() != null)
{
Person p = new Person();
p.Id = Convert.ToInt32(reader["ID"].ToString());
p.FirstName = reader["FirstName"].ToString();
p.LastName = reader["LastName"].ToString();
personsList.Add(p);
}
return personsList;
}
catch (Exception eX)
{
MessageBox.Show(eX.Message);
}
finally
{
if (connection != null)
{
connection.Close();
}
}
}
Any suggestions? im trying just to read data from my DB and fill combobox thats all..
You have declared your function to return a List<Person> but the catch block exits without returning anything
catch (Exception eX)
{
MessageBox.Show(eX.Message);
return null;
// or return an empty list if more appropriate
// return new List<Person>();
}
The compiler sees that you have coded a catch block meaning that you expect to handle an exception here. But when the catch block exits there should be a return value.
It is difficult to say what is the proper way to return in these situations. I personally prefer to return a null object and test for this in the calling code. (I avoid to return an eventually partially filled list declared at the start of the method)
A method that returns a value must have a return statement in all code paths.
In compile time, your program can't know your catch block will work or not. That's why you should add a return value inside your catch block also.
One solution could be;
catch (Exception eX)
{
MessageBox.Show(eX.Message);
return null;
}
For more information, take a look at Methods (C# Programming Guide)
Problem : if you are using return statement it should be able to return the values from all the code blocks.
Solution 1: so you need to either add it in catch block or at the end of the function.
remove the return statement return personsList; from try block and add it athe end of the function
Try This:
catch (Exception eX)
{
personsList = null;
}
finally
{
if (connection != null)
{
connection.Close();
}
}
return personsList;
OR
Add the return statement both in try and catch block
catch (Exception eX)
{
MessageBox.Show(eX.Message);
return null;
}

Returning result in nested try catch block

I am implementing some performance counters and I would like to know your opinion.
The question is should I declare response and return it outside try block or Is it OK to return it directly in the try block. Is there a difference and If so, what sample code is valid (if any).
With best regards, no9.
public string TestMethod(string document)
{
try
{
WebService ws = new WebService();
string response = null;
var startTime = PerformanceCounter.GetPerformanceCounterStartTimeHandle();
try
{
response = ws.InsertDocument(document);
}
catch (Exception ex)
{
PerformanceCounterHelper.Increment(PerformanceCounterEnum.NumberOfExternalWsCallsExceptionOnSec);
throw;
}
finally
{
PerformanceCounterHelper.IncrementPerformanceCounterByElapsedTime(PerformanceCounterEnum.DurationOfExternalCallsInSec, startTime);
PerformanceCounterHelper.Increment(PerformanceCounterEnum.NumberOfExternalCallsOnSec);
}
return response;
}
catch (Exception ex)
{
log.EventError(ex);
throw new DocumentGeneralException();
}
}
versus:
public string TestMethod(string document)
{
try
{
WebService ws = new WebService();
var startTime = PerformanceCounter.GetPerformanceCounterStartTimeHandle();
try
{
return ws.InsertDocument(document);
}
catch (Exception ex)
{
PerformanceCounterHelper.Increment(PerformanceCounterEnum.NumberOfExternalWsCallsExceptionOnSec);
throw;
}
finally
{
PerformanceCounterHelper.IncrementPerformanceCounterByElapsedTime(PerformanceCounterEnum.DurationOfExternalCallsInSec, startTime);
PerformanceCounterHelper.Increment(PerformanceCounterEnum.NumberOfExternalCallsOnSec);
}
}
catch (Exception ex)
{
log.EventError(ex);
throw new DocumentGeneralException();
}
}
As long as there isn't a difference because of not exiting (i.e. it runs additional/different code), then the code is identical. Actually, at the IL level it is illegal to ret from inside a try/catch, so one of the things the compiler does is to do exactly what you have done: introduce a local, assign the local inside the try/catch, then return that value when outside the try/catch.
Basically, go with whatever is simplest and most convenient to read. In your case, I would say "the first one".

Categories

Resources