2009-03-04 16 views
16

मैं आरएमआई का उपयोग करने के लिए नया हूं और मैं अपवादों का उपयोग करने के लिए अपेक्षाकृत नया हूं।आरएमआई और अपवाद

मैं RMI से अधिक एक अपवाद फेंकने के लिए सक्षम होना चाहते हैं (संभव है?)

मैं एक साधारण सर्वर जो छात्रों को पेश करता है और मैं विधि है जो अगर छात्र मौजूद नहीं है मैं चाहता हूँ हटाना है StudentNotFoundException का एक कस्टम अपवाद फेंक दें जो रिमोटएक्सप्शन बढ़ाता है (क्या यह करने के लिए एक अच्छी बात है?)

कोई सलाह या मार्गदर्शन की सराहना की जाएगी।

सर्वर इंटरफ़ेस विधि

/** 
* Delete a student on the server 
* 
* @param id of the student 
* @throws RemoteException 
* @throws StudentNotFoundException when a student is not found in the system 
*/ 
void removeStudent(int id) throws RemoteException, StudentNotFoundException; 

सर्वर विधि कार्यान्वयन

@Override 
public void removeStudent(int id) throws RemoteException, StudentNotFoundException 
{ 
    Student student = studentList.remove(id); 

    if (student == null) 
    { 
     throw new StudentNotFoundException("Student with id:" + id + " not found in the system"); 
    } 
} 

क्लाइंट विधि

private void removeStudent(int id) throws RemoteException 
{ 
    try 
    { 
     server.removeStudent(id); 
     System.out.println("Removed student with id: " + id); 
    } 
    catch (StudentNotFoundException e) 
    { 
     System.out.println(e.getMessage()); 
    } 

} 

StudentNotFoundException

package studentserver.common; 

import java.rmi.RemoteException; 

public class StudentNotFoundException extends RemoteException 
{ 
    private static final long serialVersionUID = 1L; 

    public StudentNotFoundException(String message) 
    { 
     super(message); 
    } 
} 

आपके उत्तर के लिए धन्यवाद अब मैंने अपनी समस्या को ठीक करने में कामयाब रहा है और महसूस किया है कि रिमोटएक्सप्शन को विस्तारित करना बुरा विचार था।

उत्तर

11

यह अपवाद (यहां तक ​​कि कस्टम वाले) के किसी भी प्रकार फेंकने के लिए बस अपने निर्यात .jar फ़ाइल में उनका पैकेज सुनिश्चित करें ठीक है (यदि आप जावा के एक संस्करण का उपयोग कर रहे हैं जहाँ आप इस मैनुअल रूप से करना)।

हालांकि, मैं रिमोटएक्सप्शन को उपclass नहीं करता। अगर किसी प्रकार की कनेक्शन समस्या होती है तो उन्हें आम तौर पर फेंक दिया जाता है। संभवतः, आपका ग्राहक कनेक्शन की समस्याओं को अन्य प्रकार की समस्याओं से अलग करेगा। जब आप रिमोटएक्सप्शन पकड़ते हैं, या किसी भिन्न सर्वर से कनेक्ट करते हैं तो आप उपयोगकर्ता को सर्वर को बता सकते हैं। StudentNotFoundException के लिए, शायद आप उपयोगकर्ता को छात्र जानकारी दर्ज करने का एक और मौका देना चाहते हैं।

2

RemoteException का विस्तार करने के आपके अपवादों की कोई आवश्यकता नहीं है।

(यह ध्यान देने योग्य है कि ठोस प्रकार के अपवाद फेंका दोनों सर्वर और ग्राहक द्वारा इस्तेमाल किया codebases में होने की जरूरत के लायक है।)

5

हाँ, यह RMI के माध्यम से अपवाद फेंक करना संभव है।

नहीं, आवेदन विफलताओं की रिपोर्ट करने के लिए RemoteException का विस्तार करना अच्छा विचार नहीं है। RemoteException नेटवर्क विफलता की तरह रिमोटिंग तंत्र में विफलता को संकेत देता है। यदि आवश्यक हो तो java.lang.Exception को विस्तारित करने के लिए उपयुक्त अपवाद का उपयोग करें।

अधिक विस्तृत स्पष्टीकरण के लिए, look at another of my answers। संक्षेप में, आरएमआई का उपयोग करते समय अपवादों को चुनने के बारे में सावधान रहें।

+0

हे, यह प्रश्न परिचित लग रहा है! –

+0

मैंने वास्तव में पोस्ट करने से पहले इसे देखा। सलाह के लिए चीयर्स - मुझे लगता है कि मुझे समस्या हल हो गई है – Malachi

2

मैं RMI से अधिक एक अपवाद फेंकने के लिए सक्षम होना चाहते हैं (संभव है?)

हां। कुछ भी serialized, अपवाद भी हो सकता है। मुझे लगता है कि अपवाद स्वयं Serializable लागू करता है।

मैं एक साधारण सर्वर जो छात्रों को पेश करता है और मैं विधि है जो अगर छात्र मौजूद नहीं है मैं जो RemoteException फैली StudentNotFoundException के एक कस्टम अपवाद फेंक करना चाहते हैं को नष्ट किया है (यह करने के लिए एक अच्छी बात है?)

मैं इसे व्यक्तिगत रूप से अपवाद का विस्तार करता। आपके अपवाद आपके अपवाद हैं, और रिमोट अपवाद उन चीज़ों के लिए हैं जो कनेक्टिविटी कारणों के लिए आरएमआई के साथ गलत हो जाते हैं।

+0

कंपाइलर को पहले पकड़े जाने के लिए सबसे विशिष्ट अपवाद की आवश्यकता होती है; आपका उदाहरण संकलित नहीं होगा। अन्यथा, अच्छी पोस्ट। –

+0

इसे हटाएं। मैं जानता था कि! – banjollity

संबंधित मुद्दे