நிரலாக்கம் அறிமுகம்/விதிவிலக்கை கையாளுதல்
எதிர்பாராத உள்ளீடு, வளங்கள் கிடைக்காமை (எ.கா தரவுத்தளம், கோப்பு), தவறனா கணிப்பு (எ.கா 0 ஆல் பிரிக்க முனைதல்), தொடரமைப்புப் பிழை (syntax error), ஏரணப் பிழை (logical error) என்று பல காரணிகளால் ஒரு நிரல் எதிர்பார்காத முறையில் செயற்படலாம் அல்லது முற்றிலும் செயலிழந்து போகலாம். நிரலாளர் நிரல் கூற்றில் எழக்கூடிய இத்தகையை பிழைகளைக் இயன்றவரை எதிர்பார்த்து, அதற்கு தக்க முறையில் நிரல் எழுதல் வேண்டும். அதற்கு உதவும் வகையில் பெரும்பாலான மொழிகள் பிழை கையாழும் கூறுகளை(error handling constructs) கொண்டிருக்கின்றன. அவற்றில் முக்கியமான ஒன்றே விதிவிலக்கை கையாளுதல் (exception handling) ஆகும்.
பொதுவாக ஒரு நிரலில் தவறாக நிகழும் எல்லாவற்றையும் விதிவிலக்காகக் கொள்வதில்லை. நிரலில் வழமையான தொழிற்பாட்டில் தவறான ஆனால் எதிர்பார்க்கக் கூடிய நிலைகளை நாம் விதிவிலக்குகள் இல்லாமல் கையாழ வேண்டும். எ.கா ஒருவர் புதுபதிகை செய்யும் போது தவறான பெயரை அல்லது கடவுச்சொல்லைப் பயன்படுத்தினால் அதை நாம் விதிவிலக்காக் கொள்ள முடியாது. இதை நாம் எதிர்பார்த்துக் கையாழ வேண்டும்.
விதிவிலக்கு என்பது சாதாரண நிரல் தொழிற்பாட்டில் எதிர்பார்க்காத ஒன்று. வழமையான இயக்கத்தில் இருந்து விதிவிலக்காக நிகழ்வு. விதிவிலைக்கை கையாளுத்தல் என்பது வழமையான இயக்கத்தில் இருந்து ஒரு விதிவிலக்கான நிகழ்வு இடம்பெறும் பொழுது அதை கையாளும் முறை பற்றிய ஒரு நிரலாக்க கட்டு (construct) ஆகும். பெரும்பாலான மொழிகள் try (முயற்சி), catch (பிடி), throw (எறி), finally (இறுதியாக) ஆகிய சிறப்புச் சொற்களை (keywords) விதிவிலக்குக் கையாழுதலுக்குப் பயன்படுத்துகின்றன.
ஒரு செயலி இயக்கப்படும்(try) போது அந்தச் செயலியில் விதிவிலக்கு ஒன்று நிகழ்ந்தால் அச் செயலி விதிவிலக்கு பொருள் ஒன்றை உருவாக்கி எறியும்(throw). அந்த விதிவிலக்குப் பொருளை இயங்குநேர ஒருங்கியம்(runtime system) இந்த விதிவிலக்கைக் கையாழக் கூடிய விதிவிலக்கு கையாளு நிரல் (exception handler - catch) ஒன்றைக் கண்டுபிடிக்க முனையும். இவ்வாறு கண்டுபிடிக்க முடியாவிட்டால் இயங்குநேரம் நின்றுவிடும்.
விதிவிலக்கை கையாளுதலின் பயன்கள்
[தொகு]- ஒவ்வொரு செயலியில் இருந்தும் பிழைத் தகவல்களை திருப்பியனுப்பி, அவற்றைச் சோதித்துப் பார்க்கும் நிரல் கூறுகளைத் தவிர்க்கலாம். இந்த நிரல் கூறுகள், நிரலின் வழமையான செயற்பாட்டை மறைத்து, நிரலை வாசிக்க, பராமரிக்க சிரமமாக்கும்.
- விதிவிலக்கு பொருட்கள் ஒரு பிழை தொடர்பாக கூடிய தகவல்களைக் கொண்டிருக்கும்.
விதிவிலக்கை எப்பொழுது கையாழ வேண்டும்
[தொகு]விதிவிலக்கை எப்படிக் கையாழ வேண்டும்
[தொகு]எடுத்துக்காட்டுக்கள்
[தொகு]யாவா
[தொகு]தொடரமைப்பு
[தொகு]try {
// வழமையான செயல்படுத்தல் வழி
if (someCondition)
throw new EmptyStackException();
} catch (ExampleException ee) {
// விதிவிலக்கு நிகழ்ந்தால், அதைக் கையாழுவதற்கு, அல்லது அதில் இருந்து மீள்வதற்கான நிரல்
} finally {
// try அல்லது catch கட்டங்கள் முடிவுற்றபின் இயக்கப்படும் நிரல் கூறு (எல்லாச் சூழ்நிலைகளில் இது பயன்படுத்தப்படுவதில்லை)
}
எடுத்துக்காட்டு 1
[தொகு]package Test;
public class Test
{
public static void main(String[] args)
{
String Result = testException();
System.out.println("Result from testException " + Result);
}
public static String testException()
{
int x = 0;
int y = 120;
int result = 0;
result = y / x;
return new Integer(result).toString();
}
}
நீங்கள் மேலே தரப்பட்ட எடுத்துக்காட்டை இயக்கினால் கீழ்வரும் விதிவிலக்கு எறியப்பட்டு நிரல் நின்றுவிடும்.
Exception in thread "main" java.lang.ArithmeticException: / by zero at Test.Test.testException(Test.java:16) at Test.Test.main(Test.java:7)
இதையே நீங்கள் விதிவிலக்கு try catch கூறுகளைப் பயன்படுத்தி பின்வருமாறு எழுதலாம். இதனூடாக எறியப்படும் விதிவிலக்கை நிரலை நிறுத்தாமல் கையாழலாம்.
package Test;
public class Test
{
public static void main(String[] args)
{
String Result = testException();
System.out.println("Result from testException " + Result);
}
public static String testException()
{
int x = 0;
int y = 120;
int result = 0;
try
{
result = y / x;
}
catch (Exception e)
{
e.printStackTrace();
return "ArithmeticException";
}
return new Integer(result).toString();
}
}
எடுத்துகாட்டு 2
[தொகு] Connection conn = OraCon.checkOut();
String createProcess;
PreparedStatement pStmt;
try
{
createProcess = "insert into test (ticketid, processid, status) values (?, ?, ?)";
pStmt = conn.prepareStatement(createProcess);
pStmt.setString(1, i_ticketId);
pStmt.setString(2, i_processId);
pStmt.setString(3, "Waiting");
pStmt.execute();
pStmt.close();
return true;
}
catch (SQLException e)
{
e.printStackTrace();
Logger.logException("SQL Exception in insertProcess")
return false;
}
catch (Exception e)
{
return false;
}
finally
{
OraCon.checkIn(conn);
}
வெளி இணைப்புகள்
[தொகு]- What It Really Takes to Handle Exceptional Conditions - (ஆங்கிலத்தில்)
- Exceptions and error handling - (ஆங்கிலத்தில்)