Solved

how can i get back to tryp block after an exception was thrown?

Posted on 2009-05-06
10
241 Views
Last Modified: 2013-12-17
hello experts,

i loop trought a DateTime[],
while looping i get current element,
i need the precedent elemnet too!
the prob is that for the first element there's no precendent.

i dont want to test if it's first to avoid the IndexOutOfException to raise,

my question:
what can i do, if there's a possibility, in order to continue the process after the Exception was
throws, is there a way to get back  to the try block with incrementing, the index, here 's my i variable?

i add the code,

all infos are welcome.
thanks in advance.
private ArrayList GetDrainsObj(DateTime[] aDrainDateList)

        {

            Drain _tempDrain = null;

            ArrayList _allDrains = new ArrayList();

            int index = 0;
 

            try

            {

                for (int i = 1; i < aDrainDateList.Length; i++ )

                {

                    DateTime current_drain = aDrainDateList[index];

                    DateTime  last_drain = aDrainDateList[index-1];

                    _tempDrain = new Drain(id_, Ecolog_.Id_int, current_drain, last_drain, DateTime.Now);

                    _allDrains.Add(_tempDrain);

                }

            }catch(IndexOutOfRangeException)

            {

                

            }
 

            return _allDrains;

        }

Open in new window

0
Comment
Question by:toshi_
  • 4
  • 3
  • 2
  • +1
10 Comments
 
LVL 8

Assisted Solution

by:OBonio
OBonio earned 100 total points
Comment Utility
I would aim not to throw the exception!  Checking whether you are on the first element or not is far better than letting an exception be thrown!

That said, try this :



private ArrayList GetDrainsObj(DateTime[] aDrainDateList)

        {

            Drain _tempDrain = null;

            ArrayList _allDrains = new ArrayList();

            int index = 0;

 

            for (int i = 1; i < aDrainDateList.Length; i++ )

            {

                DateTime current_drain = aDrainDateList[index];

                DateTime  last_drain;

                try

                {

                  last_drain = = aDrainDateList[index-1]; 

                } 

                catch(IndexOutOfRangeException)

                {

                  last_drain = null;

                }
 

                if(last_drain!=null)

                {

                  _tempDrain = new Drain(id_, Ecolog_.Id_int, current_drain, last_drain, DateTime.Now);

                  _allDrains.Add(_tempDrain);

                }

            }

 

            return _allDrains;

        }

Open in new window

0
 
LVL 16

Assisted Solution

by:CuteBug
CuteBug earned 100 total points
Comment Utility
Place the try catch block within your for loop and in the catch section you can add continue;
private ArrayList GetDrainsObj(DateTime[] aDrainDateList)

        {

            Drain _tempDrain = null;

            ArrayList _allDrains = new ArrayList();

            int index = 0;

 

            for (int i = 1; i < aDrainDateList.Length; i++ )

            {

                  try

                  {

                    DateTime current_drain = aDrainDateList[index];

                    DateTime  last_drain = aDrainDateList[index-1];

                    _tempDrain = new Drain(id_, Ecolog_.Id_int, current_drain, last_drain, DateTime.Now);

                    _allDrains.Add(_tempDrain);

                  }

                  catch(IndexOutOfRangeException){

                    continue;

                  }                

            }

 

            return _allDrains;

        }

Open in new window

0
 
LVL 9

Assisted Solution

by:tillgeffken
tillgeffken earned 100 total points
Comment Utility
From my point of view its bad practice to aim for exceptions, that's why they're called exceptions. What's the purpose of this? Your Drain class requires a last_drain so why not skip it alltogther?

private ArrayList GetDrainsObj(DateTime[] aDrainDateList)

        {

            Drain _tempDrain = null;

            ArrayList _allDrains = new ArrayList();

            int index = 1;

 

            try

            {

                for (int i = 2; i < aDrainDateList.Length; i++ )

                {

                    DateTime current_drain = aDrainDateList[index];

                    DateTime  last_drain = aDrainDateList[index-1];

                    _tempDrain = new Drain(id_, Ecolog_.Id_int, current_drain, last_drain, DateTime.Now);

                    _allDrains.Add(_tempDrain);

                }

            }catch(IndexOutOfRangeException)

            {

                

            }

 

            return _allDrains;

        }

Open in new window

0
 
LVL 16

Expert Comment

by:CuteBug
Comment Utility
Obonio's has provided a better solution.
0
 
LVL 9

Expert Comment

by:tillgeffken
Comment Utility
I don't see the point in even processing index 0 when you already know that it can only fail.
0
Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

 
LVL 16

Expert Comment

by:CuteBug
Comment Utility
Another method is to loop backward. This will solve it altogether.

After the loop ends, just reverse the resultant array.
private ArrayList GetDrainsObj(DateTime[] aDrainDateList)

        {

            Drain _tempDrain = null;

            ArrayList _allDrains = new ArrayList();

            int index = 0;

 

            try

            {

                for (int i = aDrainDateList.Length - 1; i > 0; i-- )

                {

                    DateTime current_drain = aDrainDateList[index];

                    DateTime  last_drain = aDrainDateList[index-1];

                    _tempDrain = new Drain(id_, Ecolog_.Id_int, current_drain, last_drain, DateTime.Now);

                    _allDrains.Add(_tempDrain);

                }

            }catch(IndexOutOfRangeException)

            {

                

            }

 

            // Reverse the order

            Array.Reverse(_allDrains);
 

            return _allDrains;

        }

Open in new window

0
 
LVL 4

Accepted Solution

by:
cauos earned 200 total points
Comment Utility
yes Obonio's has provided a better solution.but the error occured in the index not index - 1 (he started the for loop from 1 )
 for (int i = 1; i < aDrainDateList.Length; i++ )

            {

                DateTime current_drain;

                DateTime  last_drain =aDrainDateList[index-1];                

                try

                {

                   current_drain = aDrainDateList[index];

                } 

                catch(IndexOutOfRangeException)

                {

                 current_drain= null;

                }

 

                if(current_drain!=null)

                {

                  _tempDrain = new Drain(id_, Ecolog_.Id_int, current_drain, last_drain, DateTime.Now);

                  _allDrains.Add(_tempDrain);

                }

            }

Open in new window

0
 
LVL 9

Expert Comment

by:tillgeffken
Comment Utility
I still think there is no problem in the first place. You're creating one by trying to parse data of which you know that it doesn't exist. Or am i missing something?
0
 
LVL 4

Expert Comment

by:cauos
Comment Utility
you right tillgeffken, there is no logic by doing this if he want to return the array list before end the method he can add the finally statement and return the array list.
private ArrayList GetDrainsObj(DateTime[] aDrainDateList)

        {

            Drain _tempDrain = null;

            ArrayList _allDrains = new ArrayList();

            int index = 1;

 

            try

            {

                for (int i = 2; i < aDrainDateList.Length; i++ )

                {

                    DateTime current_drain = aDrainDateList[index];

                    DateTime  last_drain = aDrainDateList[index-1];

                    _tempDrain = new Drain(id_, Ecolog_.Id_int, current_drain, last_drain, DateTime.Now);

                    _allDrains.Add(_tempDrain);

                }

            }catch(IndexOutOfRangeException)

            {

                

            }

        finally

         {

            return _allDrains;

         }

        }

Open in new window

0
 
LVL 9

Expert Comment

by:tillgeffken
Comment Utility
Actually i left the Exception in there because i was too lazy to delete it. The following should be just fine (at least you won't get an IndexOutOfRangeException)

private ArrayList GetDrainsObj(DateTime[] aDrainDateList)

{

 Drain _tempDrain = null;

 ArrayList _allDrains = new ArrayList();

 int index = 1;
 

 for (int i = 2; i < aDrainDateList.Length; i++ )

 {

  DateTime current_drain = aDrainDateList[index];

  DateTime  last_drain = aDrainDateList[index-1];

  _tempDrain = new Drain(id_, Ecolog_.Id_int, current_drain, last_drain, DateTime.Now);

  _allDrains.Add(_tempDrain);

 }

 return _allDrains;

}

Open in new window

0

Featured Post

What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

Join & Write a Comment

Suggested Solutions

A basic question.. “What is the Garbage Collector?” The usual answer given back: “Garbage collector is a background thread run by the CLR for freeing up the memory space used by the objects which are no longer used by the program.” I wondered …
Many of us here at EE write code. Many of us write exceptional code; just as many of us write exception-prone code. As we all should know, exceptions are a mechanism for handling errors which are typically out of our control. From database errors, t…
It is a freely distributed piece of software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages.
This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're looking for how to monitor bandwidth using netflow or packet s…

771 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now