Theory
તૂટેલું Exam Counter
કલ્પો કે તમે એક college counter પર students ના hall tickets process કરતા administrator છો. બધું સરળતાથી ચાલે છે જ્યાં સુધી fee નું status ખૂટતું હોય એવો એક student આવે છે. જો તમે ગભરાઈ જાઓ, થીજી જાઓ, અને આખી registration ની બારી બંધ કરી દો, તો એમની પાછળ કતારમાં ઊભેલા સેંકડો બીજા students ને સહન કરવું પડશે. Programming માં, runtime errors, જેમ કે શૂન્યથી ભાગવું, એક null value આપવી, કે કાઢી નાખેલો student record શોધવો, સંપૂર્ણપણે અનિવાર્ય છે. જો તમારા program ને ખબર ન હોય કે કેવી રીતે પ્રતિક્રિયા આપવી, એ ગભરાય છે, database session crash કરે છે, અને user ને disconnect કરી દે છે. Exception handling એ system ને કહેવાની આપણી રીત છે: 'જો કોઈ ચોક્કસ error તમને પાડે, તો આખી application crash ન કરો; મુદ્દાને એક કટોકટીના handler તરફ વાળો અને બાકીના બધા માટે સામાન્ય કામગીરી ચાલુ રાખો!'
Theory
ઘરનું Fuse Box
એક exception handler ને ભારતીય ઘરમાં બેસાડેલા વીજળીના fuse box કે એક MCB (Miniature Circuit Breaker) જેવો વિચારો. જ્યારે રસોડાના કોઈ સાધનમાં ભારે voltage નો ઉછાળો કે short circuit થાય, ત્યારે fuse સલામત રીતે ઊડી જઈને માત્ર એ બગડેલી લાઈનનો પ્રવાહ કાપી નાખે છે, તમારા મોંઘા TV અને fridge ને સળગતાં બચાવતાં. PL/SQL માં, EXCEPTION section બિલકુલ એ જ સલામતીનો fuse છે. એ ઊંચા voltage વાળી code ની નિષ્ફળતાઓ પકડે છે, એમને સાફ રીતે નિષ્ક્રિય કરે છે, અને આસપાસના મુખ્ય database server ને સ્થિર અને ચાલુ રાખે છે.
Theory
Runtime નિયંત્રણના ત્રણ બચાવ
એક exception એ execution દરમિયાન ઊભી થતી database ની ચેતવણી કે error ની સ્થિતિ છે જે સૂચનાઓના સામાન્ય પ્રવાહને ખલેલ પહોંચાડે છે. PL/SQL આ ખલેલોને, સમસ્યા કોણે શોધી અને એ system ની memory ની અંદર કેવી રીતે નિશાન થાય એના આધારે, સુઘડ રીતે ત્રણ અલગ શ્રેણીઓમાં વર્ગીકૃત કરે છે.
At a glance
PL/SQL માં અસાધારણતા સંભાળવાના સ્તરોનું સંરચનાત્મક વર્ગીકરણ
| Exception ની શ્રેણી | એને કોણ વ્યાખ્યાયિત કરે છે? | Trigger થવાની વ્યવસ્થા | ઓળખવાની પદ્ધતિ |
|---|---|---|---|
| 1. Named System Exception | Oracle Engine | Standard database નિયમો તૂટે ત્યારે આપોઆપ ઊભી થાય છે. | Oracle દ્વારા NO_DATA_FOUND કે ZERO_DIVIDE જેવા સામાન્ય વર્ણનાત્મક શબ્દો પર પહેલેથી map કરેલી. |
| 2. Unnamed System Exception | Oracle Engine | સામાન્ય, વધુ દુર્લભ system error codes માટે આપોઆપ ઊભી થાય છે. | એક compiler directive થી map ન થાય ત્યાં સુધી માત્ર એક raw આંકડાકીય code (દા.ત. ORA-02292) થી ઓળખાય છે. |
| 3. User-Defined Exception | Application Programmer | Custom business logic તૂટે ત્યારે developer દ્વારા હાથે બોલાવાય છે. | એક EXCEPTION variable પ્રકાર તરીકે જાહેર થાય છે અને executable code ની અંદર RAISE વાપરીને સ્પષ્ટપણે સળગાવાય છે. |
Practical
The Complete College Registration and Fee Auditor
-- An anonymous block showcasing the operational differences across all three exception types
DECLARE
-- A. Declaring a User-Defined exception for institutional rules
e_low_attendance EXCEPTION;
-- B. Naming an Unnamed System Exception for foreign key check failures (ORA-02292)
e_child_record_found EXCEPTION;
PRAGMA EXCEPTION_INIT(e_child_record_found, -2292);
v_name students.student_name%TYPE;
v_attendance NUMBER := 68; -- Below university requirement
BEGIN
-- 1. Simulating a Named System Exception trap
-- If ID 99999 doesn't exist, this statement instantly triggers NO_DATA_FOUND
SELECT student_name INTO v_name FROM students WHERE student_id = 99999;
-- 2. Simulating a User-Defined Exception ignition
IF v_attendance < 75 THEN
RAISE e_low_attendance;
END IF;
EXCEPTION
-- Handling Named System Errors
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Catch 1: That student ID was not found in the university registry.');
-- Handling Custom Business Errors
WHEN e_low_attendance THEN
DBMS_OUTPUT.PUT_LINE('Catch 2: Admit Card Denied! Attendance is lower than the mandatory 75%.');
-- Handling Unnamed System Errors mapped by hand
WHEN e_child_record_found THEN
DBMS_OUTPUT.PUT_LINE('Catch 3: Integrity Error! Cannot wipe course because active students are tied to it.');
-- Global safety catch-all trap
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Catch 4: An unhandled anomaly occurred. System Code: ' || SQLCODE);
END;
/Follow along
એક User-Defined Exception નું જીવનચક્ર
- 1. નકશો (DECLARE) Developer સ્થાનિક block ની અંદર એક નવું custom exception ઓળખનામ નોંધે છે, compiler ને એને એક અનન્ય error ની ઓળખ તરીકે track કરવાનું જણાવતાં.
- 2. નિયમની તપાસ (IF) કાર્યરત program business logic ના variables તપાસે છે જેથી custom domain ની જરૂરિયાતો તોડતી સ્થિતિઓ પારખી શકાય.
- 3. તણખો (RAISE) Code ને એક ઉલ્લંઘન મળે છે અને એ સ્પષ્ટપણે exception ના નામ સાથે
RAISEcommand આપે છે, execution નો ક્રમ તરત અટકાવતાં. - 4. આંતરવું (WHEN) Execution નું pointer બાકીની code લીટીઓ છોડી દે છે, તરત
EXCEPTIONblock માં ઊતરે છે, error નું token મેળવે છે, અને સલામતીનો code પૂરો કરે છે.
Quiz
કઈ PL/SQL programmatic સૂચના પહેલેથી વ્યાખ્યાયિત ન હોય એવા Oracle server ના આંકડાકીય error code (જેમ કે ORA-02292) ને એક developer ના custom નામવાળા exception token સાથે બાંધે છે?
- RAISE_APPLICATION_ERROR
- PRAGMA EXCEPTION_INIT
- WHEN OTHERS THEN
- ALTER EXCEPTION TYPE
Show the answer
PRAGMA EXCEPTION_INIT
Compile-time directive PRAGMA EXCEPTION_INIT compiler ને સ્પષ્ટપણે સૂચના આપે છે કે એક custom નામવાળા exception variable ને એક ચોક્કસ ઋણ Oracle database error number સાથે બાંધે.
Watch out
ખતરનાક ચૂપચાપ મારનાર: WHEN OTHERS THEN NULL
Lab examinations માટે ખાસ ધ્યાન આપો! ઘણા students ને error screens ટાળવા માટે જ પોતાના blocks ના અંતે WHEN OTHERS THEN NULL; લખવાની ટેવ હોય છે. વાસ્તવિક દુનિયામાં આ અત્યંત ખતરનાક ટેવ છે. THEN NULL લખવું એક programming નું બ્લેક હોલ બનાવે છે, એ દરેક અણધારી error, data ની બગાડ, કે memory ની નિષ્ફળતાને નોંધ્યા વગર ચૂપચાપ ગળી જાય છે. User માને છે કે એમની ક્રિયા સફળ થઈ, જ્યારે disk પરનો data તૂટેલો છે, જે debugging ને સંપૂર્ણપણે અશક્ય બનાવે છે!
Think first
એકતરફી Execution ના ફાંદાની ચકાસણી
જો એક error આંતરાય અને એક મળતા exception block દ્વારા સંભાળાય, તો શું execution નું pointer મુખ્ય BEGIN section ની અંદરની બાકીની લીટીઓ પૂરી કરવા પાછું ઉપર કૂદે છે?
Show the answer
ના, એ ક્યારેય પાછું આવતું નથી! એક વાર નિયંત્રણ EXCEPTION block પર જાય, એ મુખ્ય block ના માળખામાંથી બહાર જવાની એકતરફી મુસાફરી છે. એક વાર exception સંભાળવાની સૂચનાઓ ચાલી જાય, આખો PL/SQL block સમાપ્ત થાય છે. જો તમારે એક અલગ નિષ્ફળતા છતાં બાકીની કામગીરી ચાલુ રાખવી હોય, તો તમારે એ ચોક્કસ ઊંચા જોખમવાળા statement ને એના પોતાના સમર્પિત nested BEGIN-END sub-block ની અંદર વીંટાળવું પડશે.
Theory
બહારના Viva માં ગુણ મેળવવાનું રહસ્ય
Lab exams દરમિયાન બહારના university મૂલ્યાંકનકારો સામે હો ત્યારે, એ પૂછવાનું પસંદ કરે છે: 'એક WHEN OTHERS handle ની અંદર કયાં built-in functions error ની વિગતો વાંચી શકે છે?' `SQLCODE` (જે સક્રિય ઋણ error number પાછો આપે છે) અને `SQLERRM` (જે error message નું ખરેખરું વર્ણનાત્મક લખાણ પાછું આપે છે) નામ આપીને એમને તરત પ્રભાવિત કરો.
Summary
Key takeaways
- Exceptions એ runtime error ની અસાધારણતાઓ છે જે program ના standard રસ્તાઓને ચાલતાં અટકાવે છે.
- Named system errors (જેમ કે NO_DATA_FOUND) આંતરિક Oracle engine દ્વારા પહેલેથી નામ પામેલી હોય છે.
- Unnamed system errors પાસે codes હોય છે પણ નામ નહીં; એમને label કરવા PRAGMA EXCEPTION_INIT વાપરો.
- User-defined exceptions custom application ના નિયમો લાગુ કરે છે અને એમને RAISE થી સ્પષ્ટપણે trigger કરવા જ પડે છે.
- એક વાર error સળગે, execution નીચે exception section પર કૂદે છે અને ક્યારેય પાછું ઉપર આવતું નથી.
- અણધારી bugs પકડવા એક સામાન્ય WHEN OTHERS catch block ની અંદર SQLCODE અને SQLERRM વાપરો.
- Memory hook: Custom નામ જાહેર કરો, તમારા નિયમો તપાસો, તૂટે તો RAISE નો વાવટો ફરકાવો, અને WHEN statement પર એને પકડો!