How to enhance exception class based on CX_ROOT
I have created an exception class based on CX_ROOT (or CX_STATIC_CHECK, CX_DYNAMIC_CHECK). Now, I need to enhance its "constructor" method with my own parameters. How can I do this? Currently system does not allow this. But, I have seen many other exception classes enhanced the way I want? Any idea?
Any pointers will be helpful.
Regards, Neetu
Hello Neetu
Two steps are required to get additional IMPORTING parameters in the CONSTRUCTOR method of your exception class:
(1) Create exception IDs (tabstrip Texts )
Example: ID=ZCX_SDN_CLASS, text=Invalid data type for field &FIELD& on screen &SCREEN& &REPORT&
(2) Add corresponding instance attributes (read-only) to your exception class
Examples: attributes FIELD, SCREEN, REPORT
Now the CONSTRUCTOR has the additional IMPORTING parameters FIELD, SCREEN and REPORT.
If you raise your exception class using id=ZCX_SDN_CLASS then the wildcards (e.g. &FIELD& in the text) will be replaced by IMPORTING parameter FIELD.
Regards
Uwe
Similar Messages
-
ABAP OO Exception Class based processing
Hi there,
Note: In going forward with SAP WAS 6.20, one can handle exceptions using exception-class based handling using RAISE EXCEPTION TYPE abc and then CATCHing it in TRY/ ENDTRY block. Standard method like GET_TEXT can be used to get the text of the exception raised.
Question: If I know the EXCEPTION CLASS and Exception ID of my exception class, is it possible to get the exception text directly from the repository without creating the exception class object?
E.g. Exception class is CX_MY_SECRET_ID
and Exception IDs for this class are
ID_NOT_FOUND,
ID_EXPIRED,
ID_IS_FOR_SPECIAL_ACCESS
E.g. last two exception IDs are my warning conditions, and if such conditions are encountered, all I want to do is collect the warning messages. Whereas first exception ID condition (i.e. ID_NOT_FOUND) is an error for me, in which I have pass the exception back to the calling program. E.g. the source code is like this:
PERFORM.......
If ID is not found
RAISE EXCEPTION TYPE ZCX_MY_SECRET_ID
EXPORTING TEXT_ID = 'ID_NOT_FOUND'.
else if ID has expired
...... then do I have to first raise the exception like raised above and CATCH it before I can get its text? or can I get the exception text directly without raising the exception first (as I know i have to retrieve the text of ZCX_MY_SECRET_ID exception class for Exception ID ID_EXPIRED)?
In other words, if a certain condition is warning for my program, can I get the condition for that exception (from exception class based on exception class name and exception ID), or do I have to RAISE it first explicitely and then CATCH it immediately and execute GET_TEXT to get its text?
Thanks very much!Hello Chetan,
in basic the raise exception type xxx creates an exception object and aborts normal execution continuing in the enclosing try block.
The Abap runtime contains some optimizations regarding the try block has an 'into xxx' clause. But as long you use the same exception you cant take benefit from this.
As far I understand your problem you have two different kind of severities. So I would use 2 differnt exception classes (maybe derived from a common parent type, or one from the other).
So both the code which throws the exception and the one which catches it are aware of the different semantic.
Kind Regards
Klaus -
How to store a class-based exception as container element?
Hello,
In a BO type method, there are situations where unexpected class-based exceptions can occur, I handle them with TRY ... CATCH ... ENDTRY.
If such an error occurs, my BO type method also returns a BO type method exception using a return code (as usually).
1) Now, my question is how can I store the exception instance in the task container ? (so that to get more information about what happened... it is an unexpected error as I said)
Note that my question may apply to any class instance.
2) To achieve this, I have an idea but not sure if it's realistic (maybe the question is not realistic too ). I'll create a new BO type ZOOINSTANC with string attribute containing the serialized instance, with a method to display it.
Example how it could work, in my BO type method (it returns EXCEPTION parameter of type ZOOINSTANC):
TRY.
CATCH cx_root INTO lo_exc.
DATA l_exc TYPE string.
CALL TRANSFORMATION id
SOURCE oo = lo_exc
RESULT XML l_exc.
DATA l_bor_zooinstanc TYPE swc_object.
swc_create_object l_bor_zooinstanc 'ZOOINSTANC' ''. "no key
swc_set_property l_bor_zooinstanc l_exc.
swc_set_element container 'EXCEPTION' l_exc.
exit_return 1001 '' '' '' ''.
ENDTRY.
One important issue is that I don't know any API to display the instance :-p
Do you have any ideas, advices, ... ?
Thx
sandraHi Mike, thank you for your answer, and sorry for the delay.
> I'd rather go with the idea of returning the error details in a structured format that you can view in the container
Yes, but that's the issue as I don't know which exceptions can be triggered, as I'd like to handle all exceptions.
> I'd also ask why it's necessary to use BOR for this?
When a BOR method fails, I want technical support to have all the details of the error, not only a generic error message. It's why I want to store the exception in the workitem container, and be able to display it later.
> It's obviously your own development, so why not use classes. Subclasses of CX_BO_ERROR are recognised by workflow and you can even bring a proper message back to the WF log. There's also some info on this in the second edition of the WF book.
I did a test using demo workflow WS56400159 ("absence"), where I forced CX_BO_ERROR right after SWX_FORMABS_CREATE call in CL_SWF_FORMABSENC / CREATE method, but it seems that only the short text of the exception is kept.
So, I'm a little disappointed to see that we have a great exception "tool" with class-based exceptions, but only the last text is kept in the system! That would have been great to be able to store the whole information (the attributes, and the whole bunch of cascading exceptions (PREVIOUS attribute), instead of only a simple text).
sandra -
How to find batch class based on material number
Hi experts,
Can any one say how to get Batch class number by giving material number as input
regards
subbuHi ,
check in MCH1 table.....
or try this way..
By using this function module you can get the batch class related to material..
* Retrieve Material Batch Classes
CALL FUNCTION 'CLAF_CLASSIFICATION_OF_OBJECTS'
EXPORTING
classtype = zc7b1_batch_class_type
features = 'X'
language = 'E'
object = w_object "Pass material Number with leading zeros
objecttable = 'MCH1' "Pass table MCH1
initial_charact = 'X'
TABLES
t_class = t_lclass " check here what are all the classes related to material
t_objectdata = t_objectdata
EXCEPTIONS
no_classification = 1
no_classtypes = 2
invalid_class_type = 3
OTHERS = 4.
Prabhudas -
How do Standard class based exceptions understand an exception?
Dear All,
Can any one explain how does the standard class based exceptions understand and identify the specific exception. For example CX_SY_ZERODIVIDE is an exception class we use to catch the divide by zero exception. How does the class understand it. To clear my point please refer the code below
data: v1 type i,
v2 type i.
try.
v2 = v1 / 0.
catch CX_SY_ZERODIVIDE.
The above code will work and an exception will be handled properly. But how??
suppose if i write..
try.
v1 = Apple
catch CX_SY_ZERODIVIDE.
it obviously doesnt work.
so my point is how does an exception class understand the exception?
I have very poor knowledge about it, i have checked the class CX_SY_ZERODIVIDE and its methods. There is no code in it. .
Any help would be greatly appreciated.
Thanks and Regards,
Abdullah.1) You can write your own log class. Call the log method from your catch
2) Upgrade to JDK1.4.0 and you can use the Logger function
3) Check jakarta for log4j -
How to create message based exception class?
Hi Guys,
I try to create exception class at Workbech (se24), for example ZCX_TEST. At header information everything is default, but radiobutton "Exception class" is set and checkbox "With message class" is set. After this I enter text for my exceptions, for example TEXT, I assign it to SAP message (for example, class 00, message number 002). I'm going to tabstrip "Attributes" and public constant with name "TEST" should appear with assigned associated type SOTR_CONC and initial value with ID (normal behavior), but attribute "TEST" is created without type and value. It is not possible to use such exception. Where I am wrong?
Regards,
EvgeniHmmm. It looks that it works fine with such definitions. Sorry for disturbs.
-
Working with class based exception and dynamic method calls
Hi Gurus,
we just changed out ERP from EHP6 to EHP7.
Since we did so we are facing an issue with an Z-Report we are using quite often.
This reports looks up Workitems and executes the according methods so that we can go into debugging if we were facing any problems or errors.
since the EHP Upgrade this statement has problems:
data: lt_parmbind type abap_parmbind_tab, lt_excpbind type abap_excpbind_tab, lo_runtime type ref to object. call method lo_runtime->(iv_cls_method) parameter-table lt_parmbind exception-table lt_excpbind.this CALL METHOD Statement has Problem with the Exception Table. We are quite often getting DYN_CALL_METH_EXCP_NOT_FOUND short dumps with Exception "CX_SY_DYN_CALL_EXCP_NOT_FOUND".
The system has problems handling the content of lt_excpbind. if i clear this table the CALL METHOD statement works fine.
AS an example we are trying to call /IDXGC/CL_PD_PROCESS_STEPS-->CREATE_DATA. This method has 2 exceptions
/IDXGC/CX_PROCESS_ERROR
Process Layer Exception
CX_BO_TEMPORARY
Temporary Business Exception
The Content of LT_EXCPBIND is
INDEX
NAME
VALUE
2
/IDXGC/CX_PROCESS_ERROR
1
2
CX_BO_TEMPORARY
2
From my point of view the Problem ist, that they are marked as "class based". I think so because if you looked up the SAP Help for the EXCEPTION-TABLE Statement it is written that is statement only works for none-classbased exception.
I think that restriction is quiet clear. But what i am wondering about is.. that restriction also exists for EHP6. And in EHP6 it work. Does anyone know why? Or how i can change me CALL METHOD Statement that i will work again?
Best Regards
UdoClass-based exceptions must be caught using try/catch statement.
Calling dynamically a method catchable exceptions are:
CX_SY_DYN_CALL_EXCP_NOT_FOUND
CX_SY_DYN_CALL_ILLEGAL_CLASS
CX_SY_DYN_CALL_ILLEGAL_METHOD
CX_SY_DYN_CALL_PARAM_MISSING
CX_SY_DYN_CALL_PARAM_NOT_FOUND
CX_SY_REF_IS_INITIAL
Anyway catching cx_root (as shown by Matthias) will catch everything is catchable. -
How to log exception from a struts action class
Hi guys,
I am recoding my application to use the strut framework. There's one small thing i wonder is that how i can log an exception arrise in an action class. In my original servlet, wherever an exception arise, i use:
catch(Exception e)
getServletContext().log("User enter an invalid date");
throw e;
}However, when i move this servlet into a action class, the getServletContext method doesnt work anymore. I thought action is a child of httpServlet but since getServletContext is not available in action, then how can i log the error?
Hope to get some help
Message was edited by:
lnthai2002Hi guys,
I am recoding my application to use the strut
framework. There's one small thing i wonder is that
how i can log an exception arrise in an action class.
In my original servlet, wherever an exception arise,
i use:
catch(Exception e)
getServletContext().log("User enter an invalid
valid date");
throw e;
}However, when i move this servlet into a action
class, the getServletContext method doesnt work
anymore. I thought action is a child of httpServlet
but since getServletContext is not available in
action, then how can i log the error?
Hope to get some help
Message was edited by:
lnthai2002Action class is just a POJO and works a handler of your request. ActionServlet invoke your Action class based on the action you call in your URL. When you are usign the Struts why do you need your Original Servel, use the ActionServlet and if required you can extend it and create your own servlet -
How to catch exception for class CL_HR_RE512W for method CHECK_CUMULATION
Hi,
How do I catch an exception when using method CHECK_CUMULATION in class CL_HR_RE512W.
This method calls an instance method READ which raises NO_ENTRY if a wage type is missing on T512W.
There is no obvious catch class to use?
My code:
data: r_512w type ref to cl_hr_re512w.
start-of-selection.
create OBJECT r_512w.
call method r_512w->check_cumulation
exporting
p_molga = molga
p_lgart = lgart
p_cumul = cumul
p_date = date
receiving
p_has_cumulation = p_flg.
If lgart = '9999', for example, then we get an error message:
'No entry in table T512W for key 08 9999 25.08.2009'Hi Gemini Twin,
Check this link:
https://wiki.sdn.sap.com/wiki/display/Snippets/ABAP+Objects+-+Defining+a+Class-based+exceptions
Hope this information is help to you.
Regards,
José -
How can we display Alerts based on Exceptions in BI7
Hi,
<b>How can we display Alerts based on Exceptions in BI7?</b> My requirement is a dashboard kind of scenario where the alerts will be displayed using WAD in Portal.
In 3.5, we used to schedule the alerts from the Reporting Agent and display that using the Alert Webitem in Web Application Designer. But I couldn't find the Reporting Agent and the Alert Webitem in BI7. I would like to know how we can do Exception Reporting in BI7. I appreciate your suggestions/comments. Thanks in advance.
Regards
HariHi,
Please go through this link:
bw 7.0
Regards,
Habeeb -
How to use user defined exception class
Hi all
I just need som help with creating a user defined exception class.
Im writing a small/simple text editor.
My exception class looks like this:
public class myExcp extends Throwable
private String message;
public myExcep(String message)
this.message = message;
public void display()
System.out.println(message);
I would like to use it when a user tries to open a exe-file instead of a txt file.
Here is some code from the editor:
if (e.getSource() == open)
saveOld();
if (fc.showOpenDialog(null)== JFileChooser.APPROVE_OPTION)
readFile(fc.getSelectedFile().getAbsolutePath());
saveas.setEnabled(true);
So, should I use exception here or at the readFile method?
readfile:
private void readFile(String fileName)
try
String tmp = fileName.substring(fileName.length() -4, fileName.length());
if (!tmp.equals(".exe"))
FileReader r = new FileReader(fileName);
textarea.read(r, null);
r.close();
currentFile = fileName;
label.setText(currentFile);
changed = false;
catch (IOException e)
JOptionPane.showMessageDialog (this, "Cannot find the file " + fileName);
Where and how do I use my exception class.
Do I need to create an instance? Where?
Should the exception class extend Exception instead?
Thank you in advance /Extend Exception, not Throwable. It's a checked exception that way.
Follow the Sun coding standards and make that exception class name start with a capital letter.
When you extend Exception, override all four ctors.
What's that display method you added? Isn't getMessage() good enough?
You need to create a new instance just before you throw the exception, of course.
Sounds like a terrible design, by the way. Exceptions shouldn't be used like "go to" for app logic. They should signal unrecoverable conditions. You can easily recover from the situation you've described simply by displaying a pop-up that tells the user to open only text-readable file types. I think that's a better solution.
% -
How to Maintain Translation of texts of Exception Class
Hi Experts,
I have an exception class ZCX_CHECK . I have maintained a text in the text tab of the exception class
like No components Exists in Package &PACKAGE_NAME&
PACKAGE_NAME is the Attribute . How do I maintain Translation of the TEXT. When I navigate like Goto->Translation , it is saying Empty Object list.
When I maintain text elements and give text-001 in the text tab of the exception class , the ouptu is coming as text-001 in the Report .
How do I amintain translation , or how can I integrate a message class with an exception class .I know where to metion messsage class . But how do I use it inside exception classLet me rephrase this: When entering a text in your Exception class it will be automatically part of the OTR. You can check this by looking this up in SOTR_EDIT.Press the binoculars button (Find), and search on package (development class).
Now via SE63: Translation->ABAP Objects->Short texts
open node OT on pop-up and double click on Subnode.Enter a * on screen for Object name and press F4. Now enter collection (package / development) class. Select the text to be translated.
BTW: Via SOTR_EDIT you can retrieve the logical key (field concept) which is needed for translation. Select the GUID (logical key / concept) from SOTR_EDIT. -
Where-used list for class-based exception texts
G'Day,
With traditional exceptions, one can look at a message, go to SE91 and do a where-used for that particular message. This is not possible with ZCX classes, a where-used can be done for the entire class but there doesn't seem to be a way to find where individual exception texts are raised.
Now whilst exception classes do offer the possiblity of a far better structuerd approach that reduces the need for a where-used in first place, this is still a shortcoming of exception classes... or is it? (or am I missing some other way to search for it?)
Cheers,
MikeD'Oh! That one was so obvious that I was blinded by it
(Believe it or not I've been using ex. classes for some time!)
However it still leaves another issue (which was actually the one that sparked this debate here in the office): In the old message concept it was far easier to navigate from an error to find the offending code. One could click on a message, see the message class/ID, drop into SE91 and (provided the where used is small enough) go straight to the offending code via a where-used.
Unless class-based exceptions are caught and re-raised as an old MESSAGE statement with a message number, this is not so simple anymore. Or is it?
Thanks,
Mike -
Handling general errors via class based exceptions
Fairly standard scenario: I've got this.
DATA: l_requester TYPE xubname.
CALL FUNCTION 'ENQUEUE_EZMYTAB'
EXPORTING
username = i_username
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
CASE sy-subrc.
WHEN 1.
l_requester = sy-msgv1.
RAISE EXCEPTION TYPE zcx_my_exception EXPORTING textid = zcx_my_exception=>lock_error
user = i_username
lockedby = l_requester.
WHEN 2.
RAISE EXCEPTION TYPE zcx_my_exception.
ENDCASE.
But what I really want for WHEN 2 is the class based exception of
MESSAGE sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1...
I.e., in my calling code, I want to catch the exception, and display whatever the original error message was as generated by the ENQUEUE function module.
I suppose I could do this
DATA: ls_error TYPE scx_t100key.
WHEN 2.
ls_error-msgid = sy-msgid.
ls_error-msgty = sy-msgty.
ls_error-msgno = sy-msgno.
RAISE EXCEPTION TYPE zcx_my_exception EXPORTING textid = ls_error
but I can't help feel I'm missing something staggeringly obvious...
mattHi Matt,
this may sound too simple:
For me the real advantage of class-based-exception is that they can be raised in an inner block and caught in an outer block at any level.
I never use the exception attributes to communicate any details, but use
IF SY-SUBRC NE 0.
MESSAGE sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1... INTO lv_string.
Raise Exception type zcx_my_exception.
ENDIF.
Catching the exception I may (roughly) know where it comes from. As the message variables are present, I can check their values or repeat the MESSAGE without INTO. The main function of MESSAGE INTO is for transparency, the ability to see the whole message in debugger in lv_string and the where-used-list if message is created by programmer..
If I really need different reaction for different SY-SUBRC ( = different untyped exception), I'd rather create different class-based exceptions. This helps transparency.
In other oo language you do not have an ABAP message concept with everywhere-present message variables. Why use this crutch of putting the message variable filled by functions exception into exception object attributes only to convert them back to message output?
I prefer [KISS|http://en.wikipedia.org/wiki/KISS_principle].
Regards,
Clemens -
hi
i am calling a outbound proxy class from a inbound proxy class. when i dragged the ourbound proxy the below code is inserted by system directly.
TRY.
CALL METHOD oref1->SEND_OUT
EXPORTING
OUTPUT = output
CATCH CX_AI_SYSTEM_FAULT .
ENDTRY.
i want to know the difference between writing just
CATCH CX_AI_SYSTEM_FAULT .
and
CATCH CX_AI_SYSTEM_FAULT . into objref. where objref refers to exception class CX_AI_SYSTEM_FAULT .
how does the system behave in either of the case if exception is raised.
thanksIn both cases, no short dump is generated, because the exception is caught. However, no info about the actual error can directly be retrieved like is done in the following example.
DATA: lv_message TYPE string,
lr_error TYPE REF TO cx_sy_zerodivide,
y TYPE i VALUE 10,
x TYPE i.
TRY.
x = y / 0.
CATCH cx_sy_zerodivide INTO lr_error.
lv_message = lr_error->get_text( ).
ENDTRY.
But this will only be of interest, when you want to determine the error. If the catch is part of another TRY ENDTRY block, the error is navigated upwards the chain.
Hope this was somehow helpful.
Maybe you are looking for
-
Implementing a multithreaded queue with Berkeley DB JE edition
Hello guys, I am implementing a queue using JE. The Queue can have several threads pushing new entries and several threads consuming from it. I have created one database with one string field as Key and another in the data. The pushing thread creates
-
Trying to password protect a directory in my portal web server
I have a third party web file manage called ckfinder that i am testing for a client and it works fine. However, when i try to password protect the directory using .htaccess file, it doesn't work. It starts out by kicking me to the SSO logine page, wh
-
My Airport TM will not backup and i keep getting the error msg "Time Machine couldn't complete the backup...An error occurred while copying files. The problem may be temporary. If the problem persists, use Disk Utility to repair your backup disk."
-
Hi all, In the Desktop Intelligence "Offline Mode" users are not able to open all documents that they have retrieved from the system. Sometimes reports are "correctly" stored during import (so that the user can open it later in offline-mode) and some
-
EPCF between BW Report and Par IView
Hi, Can anyone please let me know how can I pass some value from a BW reoprt to another iView which has been developed using JSPDynpage. Thanks, Vivek