|
Thanks for your clarification, Derek!
regards,
George
|
|
|
|
|
Derek Bartram wrote: Does anyone know if a try...catch block affects the performance of the try block code? I know it has a performance hit on hitting the block, but I wonder if it has a continuing effect beyond that.
I once worked on a project where the Project Lead insisted on try catch blocks in every bloody method.
I did some performance testing and could determine definitive costs with the setup and teardown of the block, but was unable to measure any discernable difference to the code internally.
However the code was entirely managed, perhaps wrapping unmanaged code has other implications.
I'm largely language agnostic
After a while they all bug me
|
|
|
|
|
What do you mean "unable to measure any discernable difference to the code internally"?
regards,
George
|
|
|
|
|
I couldn't find a time difference for the execution of the same code block when wrapped in a try catch as opposed to not.
I'm largely language agnostic
After a while they all bug me
|
|
|
|
|
Thanks MidwestLimey,
So you mean the performance impact of exception handling is minor?
regards,
George
|
|
|
|
|
I think he means the use of the
try
{
}
catch...
WITHOUT an Exception being thrown has little to no effect on code. The problem is when Exceptions do occur it slows everything down. Though I think that is better than the WHOLE app crashing to a grinding halt and a .NET error message dialog showing then the Microsoft error reporting tool (if enabled) poping up.
Though this has been stated many times in this thread, using exceptions to contol logic is VERY VERY bad code:
public static bool someMethod()
{
try
{
if(somthing wrong)
{
throw new Exception("Error!!");
}
}
catch(Exception err)
{
return false;
}
}
There are only a few exceptions(pun intended) to this rule and anytime I've seen something like the code as above wasn't needed...
|
|
|
|
|
Spacix One wrote: The problem is when Exceptions do occur it slows everything down. Though I think that is better than the WHOLE app crashing to a grinding halt and a .NET error message dialog showing then the Microsoft error reporting tool (if enabled) poping up.
You mean you don't think users like that?
I'm largely language agnostic
After a while they all bug me
|
|
|
|
|
Thanks Spacix,
What do you mean "using exceptions to contol logic"? We should never throw any exception when there is some logical errors during runtime?
regards,
George
|
|
|
|
|
Like in my second code block, if you throw in your method and you catch it to only return something less complex, or change your structure.
Hmm better example:
(This is an intentional BAD code example!)
static FileStream openFile(string filePath)
{
FileStream fs;
try
{
fs = File.OpenRead(filePath);
}
catch (FileNotFoundException err)
{
File.Create(filePath);
fs = File.OpenRead(filePath);
}
return fs;
}
That is bad because you could just used
File.Exist() to check for the file before opening it, and make it before trying to call OpenRead() on it. I know this is pointless but still an example of a NEVER do...
-Spacix
All your skynet questions[ ^] belong to solved
I dislike the black-and-white voting system on questions/answers.
|
|
|
|
|
Thanks for your clarification, Spacix!
regards,
George
|
|
|
|
|
I mean the code within the block doesn't magically slow down, however establishing the try catch block and then tearing it down does use some cycles.
I'm largely language agnostic
After a while they all bug me
|
|
|
|
|
Thanks for clarifying this, MidwestLimey!
regards,
George
|
|
|
|
|
MidwestLimey wrote: I once worked on a project where the Project Lead insisted on try catch blocks in every bloody method.
That sounds a little overkill, however generally I do use try...catch blocks in all my gui event handlers so that application is a little more useful when something does go wrong.
MidwestLimey wrote: I did some performance testing and could determine definitive costs with the setup and teardown of the block, but was unable to measure any discernable difference to the code internally.
However the code was entirely managed, perhaps wrapping unmanaged code has other implications.
Thank you for that, personally that is of great interest. I'm actually in the middle of writing a series of articles on language performance so hopefully i'll be able to give further insite on this.
Many thanks,
Derek Bartram
|
|
|
|
|
Thanks Spacix,
I think when you get exception, and uncaught it, your program will terminate and you will get information from console, for example. In this way, you can know what exception happens.
So, no need to catch all exceptions, right?
regards,
George
|
|
|
|
|
Thanks Derek,
1.
Derek Bartram wrote: to avoid using try...catch as much as possible due to the massive performance hit it
Do you mean catching all exception will degrade performance or you mean generally exception handling approach will degrade performance?
2.
Do you have any documents to support your points?
regards,
George
|
|
|
|
|
|
Thanks Derek,
Cool!!
Your 1st link is Java...
I am interested in your 2nd link. But confused what means "catching untestable errors" and
"not controlling programming flow"? Could you show some samples please?
regards,
George
|
|
|
|
|
George_George wrote: But confused what means "catching untestable errors"
//writer is a stream writer to a file..
try
{
writer.Write("Hello");
}
catch (Exception err)
{
//handle error
}
In this case you couldn't test for every possible error as some are far out the scope of plausible; e.g. can't access the file as it was on a removable drive that was just unplugged.
George_George wrote: "not controlling programming flow"?
//slider is a silder whos value is 0 to 100
double y = 100.0 / slider.Value
then
try
{
double y = 100.0 / slider.Value
}
catch (Exception)
{
//handler exception
}
is a bad way to write this code (remembing slider.Value could be 0 causing divide by 0 exception), a better way would be....
if (slider.Value != 0)
{
double y = 100.0 / slider.Value
}
else
{
handle error
}
|
|
|
|
|
Thanks Derek,
I agree with your sample one. But for the sample two, I can not see any advantage for the 1st sample. Because for the 2nd you preferred sample, when we write code for "handle error" in else bracket, we usually throw exception. So, both samples have the same effect of exception thrown when we met with divide by zero issues.
So, what do you think are the advantages?
try
{
double y = 100.0 / slider.Value
}
catch (Exception)
{
}
is a bad way to write this code (remembing slider.Value could be 0 causing divide by 0 exception), a better way would be....
if (slider.Value != 0)
{
double y = 100.0 / slider.Value
}
else
{
handle error
}
regards,
George
|
|
|
|
|
The point is sample two doesn't throw an exception but rather just run a different section of code. An if statement inherinatly has less overhead than that of a try...catch statement. Certainly both will perform exactly the same function however the second will run more efficiently and quicker.
|
|
|
|
|
Thanks for your clarification, Derek!
It is clear now.
regards,
George
|
|
|
|
|
Derek Bartram wrote: massive performance hit
Perhaps you haven't read this[^] yet.
|
|
|
|
|
Thanks for the link, an interesting article. I probably didn't specify 'massive' which didn't help; I meant relative to performing an if test to prevent the exception.
|
|
|
|
|
Thanks Derek,
What do you mean "didn't specify 'massive' which didn't help" and "relative to performing an if test to prevent the exception"? Could you show more description or some pseudo code about your approach please?
regards,
George
|
|
|
|
|
Firstly, from above
//writer is a stream writer to a file..
try
{
writer.Write("Hello");
}
catch (Exception err)
{
//handle error
}
In this case you couldn't test for every possible error as some are far out the scope of plausible; e.g. can't access the file as it was on a removable drive that was just unplugged.
George_George wrote:
"not controlling programming flow"?
//slider is a silder whos value is 0 to 100
double y = 100.0 / slider.Value
then
try
{
double y = 100.0 / slider.Value
}
catch (Exception)
{
//handler exception
}
is a bad way to write this code (remembing slider.Value could be 0 causing divide by 0 exception), a better way would be....
if (slider.Value != 0)
{
double y = 100.0 / slider.Value
}
else
{
handle error
}
George_George wrote: What do you mean "didn't specify 'massive' which didn't help"
It's all very well saying massive improvement or whatever, but if you don't give some quantative value or referance, massive has no meaning (it could save 0.1ms which in terms of clock cycle is alot, but probably less significant to compared to a complex if statement).
|
|
|
|