Throws vs try catch

We can use any one but which one is better to use and why ?

There is the school of thought that you should wrap some Exceptions in your own, so as to keep your classes independant.
The classic example is with a DAO (data access object)
Your DAO could use JDBC, or it could use flat file structure, or it could use HTTP to look up information. Which does it use? Who cares - as long as it gives you the info.
As such, a DAO should not throw any SQLException - because that reveals the inner workings of the DAO. Rather a custom exception - eg DAOException should be thrown that wraps the original exception, hiding the implementation details from the calling class.
So instead of your calling code catching SQLException, you catch DAOException.
// in DAO
public void saveUserRecord(User user) throws DAOException{
  Connection con = null;
  try{
    con = getConnection();
  catch(SQLException e){
    throw new DAOException("Error saving user", e);
  finally{
    try{  if (con != null) con.close(); }
    catch(SQLException e){}
// and in your user class
  try{
    dao.saveUserRecord(user);
  catch(DAOException e){
      logError("could not save user record");
      // do whatever else here.
   }

Similar Messages

  • Difference: "throws xyException" and "try/catch"

    Is there a difference? Which is it? Would thus be the same for a function:
    "functionName throws xyException"
    or
    "functionName{
    try{
    catch(xyException){
    }

    functionName throws xyException
    Calling code must call this function in a try and catch block or code won't compile.
    functionName{
    try{
    catch(xyException){
    Calling code does not have to put the call to this function in a try and catch block.
    public void methodName() throws xEcxeption{
              try{
                        // something
              }catch(Exception e){
                        // try to clean up something
                        // trhow xEcxeption to calling code so that code can do something as well.
                        // like trying an alternative, informing the user or stop executing
    }

  • Can't find class because of try catch block ?!

    Hello,
    I'm using the JNI to use a java library from my c++ code.
    JNI can't find the "Comverse10" class below, but when i put the try catch block in createMessage in comment, FindClass succeeds ?!
    Unfortunatly i need the code inside the try block ;-)
    I tried a few things, but none of them worked:
    - let createMessage throw the exception (public void createMessage throws ElementAlreadyExistsException ), so there isn't a try catch block in createMessage => result: the same
    - make a "wrapper" class Comverse that has a Comverse10 object as attribute and just calls the corresponding Comverse10.function. Result: Comvers could be found, but not constructed (NewObject failed).
    Can someone tell me what is going on ?!
    Thank you,
    Pieter.
    //Comverse10 class
    public class Comverse10 {
    MultimediaMessage message;
    /** Creates a new instance of Comverse10 */
    public Comverse10() {
    public void createMessage() {
    TextMediaElement text1 = new TextMediaElement("Pieter");
    text1.setColor(Color.blue);
    SimpleSlide slide1 = new SimpleSlide();
    //if i put this try catch block in comment, it works ?!
    try{
    slide1.add(text1);
    catch(com.comverse.mms.mmspade.api.ElementAlreadyExistsException e){}
    MessageContent content = new MessageContent();
    content.addSlide(slide1);
    this.message = new MultimediaMessage();
    message.setContent(content);
    message.setSubject("Mijn subjectje");
    for those of you who are intersted: here's my C++ code:
    //creation of JVM
    HRESULT Java::CreateJavaVMdll()
         HRESULT HRv = S_OK;
    char classpath[1024];
         jint res;
         if(blog)     this->oDebugLog->Printf("CreateJavaVMdll()");
         strcpy(classpath,"-Djava.class.path="); /*This tells jvm that it is getting the class path*/
         strcat(classpath,getenv("PATH"));
         strcat(classpath,";D:\\Projects\\RingRing\\MMSComposer;C:\\Progra~1\\j2sdk1~1.1_0\\lib");     //;C:\\Comverse\\MMS_SDK\\SDK\\lib\\mail.jar;C:\\Comverse\\MMS_SDK\\SDK\\lib\\activation.jar;C:\\Comverse\\MMS_SDK\\SDK\\lib\\mmspade.jar
         //------Set Options for virtual machine
         options[0].optionString = "-Djava.compiler=NONE"; //JIT compiler
         options[1].optionString = classpath;                                        //CLASSPATH
         //------Set argument structure components
         vm_args.options = options;
         vm_args.nOptions = 2;
         vm_args.ignoreUnrecognized = JNI_TRUE;
         vm_args.version = JNI_VERSION_1_4;
         /* Win32 version */
         HINSTANCE hVM = LoadLibrary("C:\\Program Files\\j2sdk1.4.1_01\\jre\\bin\\client\\jvm.dll");
         if (hVM == NULL){
              if(blog) oDebugLog->Printf("Can't load jvm.dll");
              return E_FAIL;
         if(blog) oDebugLog->Printf("jvm.dll loaded\n");
         LPFNDLLFUNC1 func = (LPFNDLLFUNC1)GetProcAddress(hVM, "JNI_CreateJavaVM");
         if(!func){
              if(blog)     oDebugLog->Printf("Can't get ProcAddress of JNI_CreateJavaVM");
              FreeLibrary(hVM);     hVM = NULL;
              return E_FAIL;
         if(blog)     oDebugLog->Printf("ProcAddress found");
         res = func(&jvm,(void**)&env,&vm_args);
         if (res < 0) {
    if(blog)     oDebugLog->Printf("Can't create JVM with JNI_CreateJavaVM %d\n",res);
    return E_FAIL;
         if(blog)     oDebugLog->Printf("JVM created");
         return HRv;
    //finding Comverse10 class:
    HRESULT CALLAS MMSComposer::InitializeJNI(void)
         HRESULT HRv=E_FAIL;
         DWORD T=0;
         try
              if(blog)     oDebugLog->Printf("\nInitializeJNI()");
              bJVM = FALSE;
              jni = new Java(oDebugLog);
              if(jni->CreateJavaVMdll()!=S_OK){
                   if(blog)     oDebugLog->Printf("CreateJavaVMdll() failed");     
                   return HRv;
              jclass jcls = jni->env->FindClass("Comverse10");
              if (jcls == 0) {
    if(blog)     oDebugLog->Printf("Can't find Comverse10 class");
                   jclass jcls2 = jni->env->FindClass("test");
                   if (jcls2 == 0) {
                        if(blog)     oDebugLog->Printf("Can't find test class");
                        return HRv;
                   if(blog)     oDebugLog->Printf("test class found %08x",jcls2);
    return HRv;
              if(blog)     oDebugLog->Printf("Comverse10 class found %08x",jcls);
              jmethodID mid = jni->env->GetMethodID(jcls , "<init>", "()V");
              if (mid == 0) {
                   if(blog)     oDebugLog->Printf("Can't find Comverse10() constructor");
    return HRv;
              if(blog)     oDebugLog->Printf("Comverse10() constructor found");
              jobject jobj = jni->env->NewObject(jcls,mid);
              if(jobj==0)
                   if(blog)     oDebugLog->Printf("Can't construct a Comverse10 object");
    return HRv;
              if(blog)     oDebugLog->Printf("Comverse10 object constucted");
              //Create Global reference, so java garbage collector won't delete it
              jni->jobj_comv = jni->env->NewGlobalRef(jobj);
              if(jni->jobj_comv==0)
                   if(blog)     oDebugLog->Printf("Can't create global reference to Comverse10 object");
    return HRv;
              if(blog)     oDebugLog->Printf("global reference to Comverse10 object %08x created",jni->jobj_comv);
              bJVM=TRUE;
              HRv=S_OK;
         }     catch( IDB * bgError ) { throw bgError->ErrorTrace("InitializeJNI::~InitializeJNI",HRv, 0, T); }
              catch(...) { throw IDB::NewErrorTrace("InitializeJNI::~InitializeJNI",HRv, 0, T ); }
              return HRv;

    >
    I would guess that the real problem is that that the
    exception you are catching is not in the class path
    that you are defining.Thanks jschell, that was indeed the case.
    I don't have the docs, but I would guess that
    FindClass() only returns null if an exception is
    thrown. And you are not checking for the exception.
    Which would tell you the problem.Ok, i'll remember that. But what with exceptions thrown in my java code, the documents say
    // jthrowable ExceptionOccurred(JNIEnv *env);
    // Determines if an exception is being thrown. The exception stays being thrown until either the native code calls ExceptionClear(), or the Java code handles the exception
    so, what if the java code throws an exception and catches it, will i be able to see that in my c++ code with ExceptionOccurred ?
    or
    should the java method be declared to throw the exception (and not catch it inside the method)
    Again, thank you for your help, it's greatly appreciated !

  • Can we have try/catch in a static block in a class?

    hi All
    i have a question about put a try/catch block in a static block in a class to catch exceptions that maybe thrown from using System.xxxx(). in my custom class, i have a static block to initialize some variables using System.xxx(). in case of any error/exception, i need to be able to catch it and let the caller know about it. i tried to put a try/catch block in the static block, and tried to rethrow the exception. but it is not allowed, how would i handle situation like this? thanks for your help and advise in advance.

    You could just swallow the exception inside try/catch
    block, and instead of throwing it out, just set a
    static variable to allow checking from outside
    whether the initialization succeeded, or check within
    the constructor / methods of this class for
    successful initialization, and throw the exception
    then. You could even save that exception in a static
    variable for later.Ouch, ouch, you're hurting my brain. This would allow someone to ignore a (presumably) fatal error. Throw a RuntimeException as indicated. You can wrap a checked exception in an unchecked one if need be.

  • Exception handling with try/catch in acrobat

    Hi
    I have a problem using a try/catch block in my acrobat document-script. Try to enter the following into the debugger-console:
    try{nonexistentFunction();}catch(e){console.println('\nacrobat can't catch')}
    and run it. The output will be:
    nonexistentFunction is not defined
    1:Console:Exec
    acrobat can't catch
    true
    The whole point of a rty/catch block is for the application  NOT to throw an exception, but instead execute the catch-part of the  statement. However, acrobat does both: It throws an exception AND  executes the catch-block.
    Is there another way to suppress the exception, or to make the try/catch-block work as it's supposed to?

    > Also Adobe provides for free the JS or compiled file for Acrobat Reader to support the JS console.
    Where is that file located ? How to install it or where to place it ?
    What is the method referred by try67 on his site where he sells a product ?
    Is that the same as the compiled file you refer to ? or did he sell his solution to adobe ?
    It is helpful if people can get an idea of the nature of choices available and make informed decisions, than a cloak and dagger approach.
    For some jobs that we have, I have been very frustrated by a consultant who wont even give basic info for transparent billing despite all assurances for privacy, as a result we are forced to do the job ourselves.
    Dying Vet

  • About the finally block of the try catch.

    I know that finally block contains the code that will be executed in any condition of the try catch.
    However, I think it is unneccessary, since the stack after the try catch stack will be executed any way.
    Any one can help?
    for example
    try{
    System.in.read();
    catch(Exception e){}
    finally
    { System.out.println("does this matter?");}and
    try{
    System.in.read();
    catch(Exception e){}
    System.out.println("does this matter?");

    However, I think it is unneccessary, since the stackafter the try catch
    stack will be executed any way.That does assume that you catch and handle the error
    appropriately.
    Of course this is valid as well, and demonstrates
    when you would WANT a finally clause.
    Connection con = null;
    Statement stmt = null;
    try{
    con  = Database.getConnection();
    stmt = con.createStatement("Select * from dual");
    // maybe something throws an exception here?
    finally{
    if (stmt != null){
    stmt.close();
    if (con != null){
    con.close();
    The finally block here might throw a null pointer exception itself use
    null!=stmt null!=stmt

  • Return statement should put beyond try/catch clause??

    The return statement should put beyond the try/catch clause, is that correct? Well,
    I tried to put inside the try block, but it will have compile error though.
    public String getValue()
         String value;
         try
         catch(...)
         return value;
    please advise. thanks!!

    When a method returns a value, you must make sure that even if an exception is thrown and caught a value will be returned (or just throw the exception out of the method).
    You can put a return clause as the last thing in the try block and another return clause after the catch block (this is where we go if we catch an exception so you probably want to return null).

  • Return statement and Try Catch problem

    Hi!!
    I've got the next code:
    public ResultSet DBSelectTeam(String query) {
    try {
    Statement s = con.createStatement();
    ResultSet rs = s.executeQuery(query);
    return rs;
    } catch (Exception err) {
    JOptionPane.showMessageDialog(null, "ERROR: " + err);
    But I need a return statement in the catch-block, but I don't know what's the best option.
    Help...
    Many thanks.

    The error message is: "missing return statement", Yes, I know.
    You have to either return from the catch statement, or throw from the catch statement, or return or throw after the catch statement.
    The only ways your method is allowed to complete is by returning a value or throwing an exception. As it stands, if an exception is thrown, you catch it, but then you don't throw anything and you don't return a value.
    So, like I said: What would you return from within or after catch? There's no good value to return. The only remotely reasonable choice would be null, but that sucks because now the caller has to explicitly check for it.
    So we conclude that catch shouldn't return anything. So catch must throw something. But what? You could wrap the SQLE in your own exception, but since the caller is dealing with JDBC constructs anyway (he has to handle the RS and close it and the Statement), there's no point in abstracting JDBC away. Plus he has to deal with SQLE anyway in his use of the RS and Statement. So you might as well just throw SQLE.
    So since you're going to just throw SQLE anyway, just get rid of the try/catch altogether and declare your method throws SQLException

  • Basic (try catch finally)

    Try catch and finally were thing i recently neglected to use unless my ide made me, but i was just reading on how to use them and I have a question about something i couldn't find an answer for:
    objects you declare in try statements e.g.:
    try{
    BufferedReader br=...;
    are only available in the scope of that try statement. Is this bad programming style or would "br" be automatically destroyed after the try statement is exited?

    Well, define "dispose". If there's some method on the object that you need to call to clean that object up, you'll have to declare the variable outside the try block and then call it:
    Something it;
    try {
      it = SomethingFactory.createHeavyObject();
      it.doSomething(); // may throw Horse exception
      it.doSomethingElse();
    } catch (Horse e) {
      e.printStackTrace();
    } finally {
      it.releaseResources();
      it = null;  // only necessary if there will be a long time before "it" goes out of scope
                  // and even then maybe not if releaseResources() took care of the heavy stuff
    }On the other hand, you should never have to do this:
    Something it;
    try {
      it = new Something();
      it.doSomething(); // may throw Horse exception
    } catch (Horse e) {
      e.printStackTrace();
    } finally {
      it = null;
    }Instead you could just do:
    try {
      Something it = new Something();
      it.doSomething(); // may throw Horse exception
    } catch (Horse e) {
      e.printStackTrace();

  • Try Catch Blocks

    This may be too vague of a question but is it bad practice to use one large try catch block? In my mind it seems like it would produce "cleaner" code as far as programmer reading is concerned, but does it affect the program adversely?
    try {
    // code goes here
    } catch (somekindofexception e){
    // print exception e
    } catch (anotherkindofexception e){
    // print exception e
    } // continue for all possible exceptions

    bolivartech wrote:
    I was mistaken it looks like the particular function I was thinking of throws 3 kinds of RuntimeExceptions, but the same idea applies right?
    try {
    } catch (RuntimeException e) {
    System.err.println("Caught RuntimeException: " +  e.getMessage());
    Yes, you can do that if you want to handle all of them the same.
    However, if you want to handle different exceptions differently, you'd catch those specific exceptions, rather than the parent exception type. This is a separate issue from whether you have one big try or lots of little trys.
    NOTE HOWEVER THAT YOU SHOULD NOT CATCH RuntimeException OR ITS DESCENDANTS. RuntimeException indicates an error in your code. Catching it is usually pointless, because you can't recover from it, and trying to continue on will probably lead to corrupt results at best.

  • Try catch implementation in dynamic query

    I am fetching values by dynamic selection  (select a,b,..from (var)...) .
    Eveytime if I am selecting garbage value of var it will throw dump . Can u tell me how we implement try catch method / exception handling method so that I can avoid dump in dynamic query
    Appropriate answer will rewarded with points  that is for sure .

    Here is the usage  of th try statements ...
    PARAMETERS number TYPE i.
    DATA: result TYPE p LENGTH 8 DECIMALS 2,
          oref   TYPE REF TO cx_root,
          text   TYPE string.
    TRY.
        IF ABS( number ) > 100.
          RAISE EXCEPTION TYPE cx_demo_abs_too_large.
        ENDIF.
        PERFORM calculation USING    number
                          CHANGING result
                                   text.
      CATCH cx_sy_arithmetic_error INTO oref.
        text = oref->get_text( ).
      CATCH cx_root INTO oref.
        text = oref->get_text( ).
    ENDTRY.
    IF NOT text IS INITIAL.
      WRITE / text.
    ENDIF.
    WRITE: / 'Final result:', result.
    FORM calculation USING    p_number LIKE number
                     CHANGING p_result LIKE result
                              p_text   LIKE text
                              RAISING  cx_sy_arithmetic_error.
      DATA l_oref TYPE REF TO cx_root.
      TRY.
          p_result =  1 / p_number.
          WRITE: / 'Result of division:', p_result.
          p_result = SQRT( p_number ).
          WRITE: / 'Result of square root:', p_result.
        CATCH cx_sy_zerodivide INTO l_oref.
          p_text = l_oref->get_text( ).
        CLEANUP.
          CLEAR p_result.
      ENDTRY.
    ENDFORM.
    <b>please see this  link for detailed  explaination  of the TRY & ENDTRY  ...</b>
    <a href="http://">http://help.sap.com/saphelp_nw04/helpdata/en/a9/b8eef8fe9411d4b2ee0050dadfb92b/content.htm</a>
    reward  points if it is usefull......
    Girish

  • Please help with try/catch

    Hello, I'm writing a program and I got surprised with the following. I've got the following try/catch block:
    try {
    String param = config.getConfigValue("db2.driver");
    if (param == null)
    // parameter not defined.
    throw new Exception("Parameter 'db2.driver' missing!");
    else
    Class.forName(param);
    catch (SQLException sqlEx) {
    // do something
    catch (Exception e) {
    System.out.println("*** ERROR loading driver..."); (1)
    finally {
    releaseDB2Resources();
    I know the program flow goes through the finally block, but it doesn't print the message (1). Why is that? I don't understand it. What am I doing wrong?
    Thanks in advance.

    A finally block always gets executed, so that's why the println always works there. The only reason why the println in the catch wouldn't work is if that exception wasn't thrown. If a config value is not there, it might be the null string "" instead of null. Try this:
    if (param.equals(""))
    throw new Exception("blah");
    You could also try:
    if (true)
    throw new Exception("blah");
    to make sure that the exception is caught where you think it should be.

  • Plugin and try/catch problem

    I have a plug-in that was working perfectly until I added an FileOutputStream and its corresponding try/catch block. Now when I try to run my plugin, the popup menu come up corrctly but when I click to run my code it tells me the operation is not available. If I delete those three line it works fine again.
    Instead or try/catch I could do run() throws XYZException, but that gives an error. Any ideas how I can get this fixed? Thanks

    turns out that was not really what was causing the error. I was using the iText library, and I had added it to the classpath of the plugin but I didnt add it to the runtime classpath, so my 'new' eclipse windows was not working properly. Thanks anyways

  • ExtendScript try/catch difference when script ran from ESTK and Illustrator

    Hello,
    I've written an ExtendScript for Illustrator using the ExtendScript ToolKit (ESTK).  This scripts works really well when running it in Illustrator from the ESTK (using the target application functionality).
    However when I run it directly within Illustrator (by selecting it from the dropdown File > Scripts) I get a run time error.  Is this normal?  Should I expect differences when running the script in these two different ways?
    The error is in this function...
    ```
    function itemUsable (arr, item) {
        var usable = true;
        try {
            arr[item];
            usable = true;
        } catch(e) {
            $.global.alert(e);
            usable = false;
        return usable;
    ```
    The point of the code is to get around Illustrator's issue of throwing errors when accessing properties that don't always exist.  Ran from ESTK the try/catch statement catches the error "No such element" and then sets the function to return false.
    When ran directly from Illustrator the error message fires but the try/catch doesn't seem to stop the script from exiting.
    The only difference I can see is when running the script from ESTK the dropdown menu next to the application target dropdown is always (and has only the option) "main".  Running the script directly from Illustrator, when the error is thrown this dropdown option is set to the value "transient".
    See this screenshot for an example what I mean
    Any help would be much appreciated.
    Thanks,
    /t

    Thanks Trevor.
    So it turns out that a script executed in Illustrator from ExtendScript has a different debug mode compared to a script that is opened directly by Illustrator.  Useful to know.

  • Try catch and finally

    Finally block should executed whether try goes successfully or the program goes to catch.
    Am I right?
    I have this kind of code here using BEA WLS:
         * @jpf:action
         * @jpf:forward name="success" path="reportView.jsp"
         * @jpf:forward name="error" path="../error.jsp"
        protected Forward viewReport(ViewReportForm vrForm)
            try{
                return new Forward("success");
            catch(Exception e){
                log.error(this,e);
                e.printStackTrace();
                getRequest().setAttribute("errorMessage",e.getMessage());
                return new Forward("error");
            finally
                try
                    if (conn!=null)
                        conn.close();
                    if (rs!=null){
                        rs.close();
                    if (stmt!=null)
                        stmt.close();
                    conn=null;
                    rs=null;
                    stmt=null;
                    array=null;
                    params=null;
                    query=null;
                    q_where_pp=null;
                    html=null;
                    *System.out.println("Testing finally block");*
                catch(Exception e)
                    log.error(e);
                    e.printStackTrace();
        }Note that I put System.out.println("Testing finally block"); to test whether finally block gets executed.
    When try goes fine which is return to page reportView.jsp the finally will be executed.
    But when it goes wrong which goes to error.jsp the finally block never print out the sentence.
    Which make me confuse, why finally block never executed after catch block.
    Anyone could help me?

    pramudya81 wrote:
    finally
    try
    if (conn!=null)
    conn.close();
    if (rs!=null){
    rs.close();
    if (stmt!=null)
    stmt.close();
    conn=null;
    rs=null;
    stmt=null;
    array=null;
    params=null;
    query=null;
    q_where_pp=null;
    html=null;
    *System.out.println("Testing finally block");*
    catch(Exception e)
    log.error(e);
    e.printStackTrace();
    First of all, your finally is after a bunch of statements, so if any of those statements throw an exception, your println() will never be executed. Finally does not mean that everything in the finally block gets executed even if they throw exceptions, it means execution will begin in the finally block before leaving the method try/catch.
    Second, closing connections, result sets, and statements can all throw exceptions (you know this because you put a try/catch block around it). And they're pretty much guaranteed to throw an exception in this case: Closing a connection closes all the statements associated with it (and closing a statement will close the resultset associated with it). So when you try to close the resultset, it's already closed. This should've showed up in your logs. You need to re-order your closes, and put each close in its own try/catch block.

Maybe you are looking for

  • SAX Parser is dropping characters

    Hello, We have noticed that the BEA implementation of the SAX parser appears to drop characters from the start of an attribute's value. For example: <attribute-value>au.com.bonline.bean.SomeClass</attribute-value> becomes online.bean.SomeClass after

  • How to airplay from mac

    I have just resently updated my iMac to Mountain Lion and would like to know how to setup AirPlay from my iMac to my AppleTV... thanks

  • Merge cells in JTable.......

    Plz some help me out ......i want to merge two consecutive cells of a row in one cell in JTable......... how to do that.....give some code if possible....

  • How to check the Oracle database version

    Hi, How can i check, what type of database am using and which version? Can anyone help me to know?

  • BDE Connection on Azure

    Hello, i'm having problem on connecting SQL Server Azure via BDE (Borland Database Engine),  i'm testing if we can move our DB to azure but i need to connect with BDE to SQL Azure. BDE cannot find sql via name (like z7o15r43sm.database.windows.net).