|
I catch everything on layer boundaries. What happens there depends on the layer and where I catch it.
I catch everything on adapter boundaries, although that is just a specialization of a layer boundary. However I also tend to catch everything at the adapter top level as well.
When I catch everything then handling involves the following
1. log it, and take appropriate action which might include throwing a different exception WITHOUT including the original exception.
2. Don't log it and take appropriate action which might include throwing a different exception INCLUDING the original exception in the new exception.
I do NOT use catch alls which do nothing but log and then rethrow. That is pointless and a waste of time since the caller should be catching and will then end up logging as well.
There are of course extreme conditions where the above can be problematic. For example out of memory errors. Those can cause the log to fail as well. However without some logging figuring out an out of memory occurred is impossible. There are things like stack over flow in C# which CANNOT be caught so one is kind of out luck there.
This however does NOT mean that one can ignore the code that one is working with. If I am working on a communications layer then I expect communication exceptions. And I expect to take specific actions with regards to those.
I suppose what it really comes down to is that I use catch all because I am almost certain that some unexpected exception will occur at some point and I need to still behave in some reasonable manner. At other times I am not certain and thus it is inappropriate to take such action. Which is why boundary layers are often the only place this occurs.
|
|
|
|
|
Srinivas Kalabarigi wrote: i am sure it throws an exception
That's silly; how do you do that?
Srinivas Kalabarigi wrote: use it in most places of your code
No, only where it makes sense.
Srinivas Kalabarigi wrote: what is the best practice
That depends on your situation; different domains require different techniques.
I work mostly in the back-end with libraries and databases, which is very different from the front-end.
Most times I have a catch, it's a catch-all; I rarely need to have special handling for different Exceptions.
The main thing I usually need to do is to add information to the Data collection of the Exception and rethrow it.
Many times, I also need to rollback a transaction or perform some other clean up task.
Also, most times that a problem happens in a database all I get is a System.Data.DataException and I have to investigate it to see what the problem was -- deadlock, timeout, duplicate key, etc. (and no two database systems report it the same way) -- then I can wrap the DataException in a more detailed custom Exception -- DeadlockException, TimeoutException, DuplicateException, etc. and throw it so the caller can decide how to procede.
The main thing here is to add information to make the caller's job easier; but the ultimate decision of what to do is up to the caller.
|
|
|
|
|
Use try-catch unless you want your clients complaining "i got this error and then the entire application shut down".
|
|
|
|
|
I'd rather have them complain once and explain that it's a bug that will never resurface, than having a lot of exceptions (and invalid states) that I don't know of.
I love the PHP-approach; either do or die, don't fake it.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
I'm with Abhinav - use try catch, but report a problem to the user.
Nothing, but nothing, is so damn annoying as losing an hour's work because a programmer didn't bother to allow for an alpha character in a numeric field!
Have you never sworn because an app went "...caused an exception and needs to close" and you lose a bunch of work?
This message is manufactured from fully recyclable noughts and ones. To recycle this message, please separate into two tidy piles, and take them to your nearest local recycling centre.
Please note that in some areas noughts are always replaced with zeros by law, and many facilities cannot recycle zeroes - in this case, please bury them in your back garden and water frequently.
|
|
|
|
|
OriginalGriff wrote: Nothing, but nothing, is so damn annoying as losing an hour's work because a programmer didn't bother to allow for an alpha character in a numeric field! Yes, it's loosing a day because that exception is swallowed somewhere deeply within the system.
OriginalGriff wrote: Have you never sworn because an app went "...caused an exception and needs to close" and you lose a bunch of work? There's an auto-save, but my Ctrl-S reflex is still alive.
And yes, I'd rather see my app die, than pretend nothing happened (and have it continue with corrupted data that gets saved later)
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
I'm not saying "swallow it" and "pretend nothing happened".
I'm saying use the tools and locate it while you (as a programmer) can still prevent it adversely affecting the user. Then report it, log it (both is good) and give them a chance to do something. Just letting your program crash is just being lazy!
This message is manufactured from fully recyclable noughts and ones. To recycle this message, please separate into two tidy piles, and take them to your nearest local recycling centre.
Please note that in some areas noughts are always replaced with zeros by law, and many facilities cannot recycle zeroes - in this case, please bury them in your back garden and water frequently.
|
|
|
|
|
OriginalGriff wrote: Just letting your program crash is just being lazy! Aight.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Eddy Vluggen wrote: than having a lot of exceptions (and invalid states) that I don't know of.
Been writing servers for 15 years, high capacity ones for 10, and I have never seen that.
What I have seen are a lot of null pointer exceptions caused by programming adaptors in plugin architectures doing dynamic processing. Which means that the ALL transactions in flight would then fail simply because a one time data set caused a bug to show up.
And I can note that in most cases the adapter code was not written by me but the plugin architecture was.
I have seen catastrophic failures but they take the server down. And in that case catching the exceptions at least for the purpose of logging is critical.
Eddy Vluggen wrote: I'd rather have them complain once and explain that it's a bug
I rather not have to explain anything when all the customers suffered some sort of failure due to something that could have been avoided.
|
|
|
|
|
Down vote countered - not checking or catching errors is just lazy programming, and is unfair on the people who pay our wages!
This message is manufactured from fully recyclable noughts and ones. To recycle this message, please separate into two tidy piles, and take them to your nearest local recycling centre.
Please note that in some areas noughts are always replaced with zeros by law, and many facilities cannot recycle zeroes - in this case, please bury them in your back garden and water frequently.
|
|
|
|
|
OriginalGriff wrote: Down vote countered
Thanks.
|
|
|
|
|
OriginalGriff wrote: not checking or catching errors is just lazy programming No-one advocates "not" checking them; so the statement that one should is superfluous.
Using a pokemon-handler is lazy; if you expect an exception, than you can see if you can handle it locally. Unhandled exceptions would be logged in a single place.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Eddy Vluggen wrote: No-one advocates "not" checking them;
Um.
Eddy Vluggen wrote: And yes, I'd rather see my app die, than pretend nothing happened (and have it continue with corrupted data that gets saved later)
Eddy Vluggen wrote: I'd rather have them complain once and explain that it's a bug that will never resurface, than having a lot of exceptions (and invalid states) that I don't know of.
I love the PHP-approach; either do or die, don't fake it.
This message is manufactured from fully recyclable noughts and ones. To recycle this message, please separate into two tidy piles, and take them to your nearest local recycling centre.
Please note that in some areas noughts are always replaced with zeros by law, and many facilities cannot recycle zeroes - in this case, please bury them in your back garden and water frequently.
|
|
|
|
|
OriginalGriff wrote: And yes, I'd rather see my app die, than pretend nothing happened (and have it continue with corrupted data that gets saved later) I do not advocate there that one should not handle exceptions. "Do or die" means that I'll try to close the app as gracefully as possible, with an apoligy to the user that an exception occured.
OriginalGriff wrote: I'd rather have them complain once and explain that it's a bug that will never resurface Does still not mean that I do not have a global exception handler; it's implemented, but it does not "hide" exceptions and pretend all is well. It get's logged, and once investigated, one can easily push an update that ignores that specific exception if that's safe.
Imagine medical software being like that, and using the "default gender" if that information is lost after an exception on a conversion.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Eddy Vluggen wrote: Imagine medical software being like that, and using the "default gender" if that
information is lost after an exception on a conversion.
Ridiculous analogy.
Computers are deterministic even if it seems random at times. Catastrophic system failures in code that has even a reasonable amount of quality control are rare. Even rarer to happen in production. What happens much more are unexpected but normal errors. And at least in 24x7 servers (which you don't seem to be describing) it can't just quit because of an little known and non-tested data path results in a null pointer exception.
When catastrophic errors do occur they are, oddly enough, catastrophic. They cause the entire system to fail and it is obvious.
So you are hypothesizing some extremely rare circumstances where such an error allows the system to keep running yet corrupts the entire system completely such that there are no other validation checks that would catch anything (my code has validation checks.) And that just is not reasonable when compared to unexpected conditions which can be ignored and which occur much more often.
|
|
|
|
|
Normally I don't us try-catch block. Except for exceptions I code myself and if there's something really not sure.
|
|
|
|
|
Try to avoid try-catch when you can. Often an if/else statement can help you out. (divide by zero, file exists, eof, ...)
That doesn't mean you shouldn't use try/catch, but use them were appropriate. IOW some 'exceptional' thing might happen. (an object has a null value although it shouldn't, ... )
Hope this helps.
|
|
|
|
|
Dear,
Please help me to get C# code to Get User Privileges in a machine for a specific user.
I will have a Service userName like
String userName = "myDomain\userName";
String remotemachineName = "RemoteMachineName";
Form my C# code, I should be able to find the User Priviliges for the User in the specified Machine.
GetUserPrivileges(userName, remotemachineName)
Thanks for the help in advance.
Regards,
Rijz
|
|
|
|
|
|
I just ran into a real headscratcher. I have code that does the following:
var textReader = new StreamReader(path + "\\web.config");
var fileContents = textReader.ReadToEnd();
if (fileContents.IndexOf(oldPwd, StringComparison.Ordinal) == -1)
{
Log("Old Password Not Found.", 0);
}
else
{
Log("Replacing old password", 1);
fileContents = fileContents.Replace(oldPwd, newPwd);
}
What I've found is that if the oldPwd contains ^ then things get weird.
1. If the old password ends in a ^, e.g. 123^ then the IndexOf works, but the Replace does will keep the ^ intact. So, with oldPwd = 123^ and newPwd = 456 then Replace will leave the file looking like 456^
2. If the old password has a ^ in the middle of it then IndexOf will return a -1.
I'm baffled to be honest and not sure if it has to do with how I'm reading the file in or what. But I tried this on an online compiler and it worked just fine. So it has to be me, right?
EDIT: I also tried it in my code with hard coded strings and it behaves just fine:
var mystring = "this is a password 123^ yeah";
Console.WriteLine("Did it find it: " + mystring.IndexOf("123^", StringComparison.Ordinal).ToString());
Console.WriteLine("Did it replace it: " + mystring.Replace("123^", "456"));
mystring = "this is a password 123^456 yeah";
Console.WriteLine("Did it find it: " + mystring.IndexOf("123^456", StringComparison.Ordinal).ToString());
Console.WriteLine("Did it replace it: " + mystring.Replace("123^456", "abcdefg"));
FURTHER EDIT: Apparently if I run this through Visual Studio and step through the code it works fine. When I compile the code and run it from the command prompt it exhibits the behavior I outlined above.
modified 22-Aug-13 11:35am.
|
|
|
|
|
The web.config file is just an xml file, so perhaps the way to deal with this is to load the file as an XMLDocument and then simply navigate to the node containing the old password and change its value.
I wasn't, now I am, then I won't be anymore.
|
|
|
|
|
Unfortunately I don't always know which node the password will be in which is why I went with treating it as a string.
|
|
|
|
|
This confused me a while back as well. ^ is the escape character on the command line, so escape it (^^ ) and it should work as expected.
|
|
|
|
|
I owe you a beer! Thank you!
|
|
|
|
|
I'm using dataset for get values the table on access. The field date_ is shown in listview on format mm/dd/yyyy, but i need format dd/mm/yyyy.
I load values in listview with the code:
listview_.DataContext = _dataSet;
I tried:
string strDate = _dataset.Table["table"].Rows[0]["field_date"].ToString();
_dateset.Tables["table"].Rows[0]["field_date"] = DateTime.ParseExact(strDate, "dd/MM/yyyy", CultureInfo.CurrentCulture);
But not work. What can i do ?
|
|
|
|