La decisión de hacer RemoteException un excepción y que requiere remotas métodos para enumerar la excepción de comprobarse su cláusula throws no es uno religioso. La decisión se basa en cómo hacer que la informática distribuida sea confiable. Esta pregunta aparece cada vez en un mientras está en nuestra lista de usuarios. Tengo una respuesta detallada que he publicado un hace tiempo. Aquí está si está interesado . No pude encontrarlo en el archivo de usuarios de rmi , así que lo incluí en a continuación.
me gustaría abordar la justificación para hacer RemoteException una marcada Excepción, en lugar de una RuntimeException .
1) redes no son confiables
Me gustaría que lo fueran, pero de hecho, no lo son. Cada red tiene fallas transitorias. Puede construir en redundancia de red, pero el hecho es que la mayoría de las redes no tienen eso. Las intranets tienen fallas transitorias, ya que hace Internet. Por lo tanto, cada RPC realizada, está sujeta a un error. Los tipos de fallas pueden no tener nada que ver con con la "red", per se; si su servidor se queda sin descriptores de archivos, su cliente obtendrá una conexión excepción. Esto no es una falla de red , en el sentido de que la red está rota; su servidor está en un estado transitorio del recurso hambriento.
RMI no está diseñado para manejar solo el caso limitado que toda la red se bloquea cuando una sola máquina se cuelga. Dicha red se consideraría fiable, ya sea todo es hacia arriba o hacia abajo todo es - no hay fallo parcial. RMI está destinado a para una audiencia más general.
2) RPC fracaso no se puede ocultar de el cliente
fracaso parcial de programación es un hecho de la distribuido; estas fallas no se pueden ocultar al programa . Un fallo aparece en el cliente , si la excepción es facturado o de excepción no comprobada, que sigue apareciendo. Entonces, ¿cómo deben indicarse tales fallas al cliente?
3) excepciones comprobadas fomentan más programas robustos
Hubo un tiempo en que el roble y primera versión de Java no tenían excepciones marcada. El manejo de excepciones fue de advertencia, y el mundo no era seguro . Fue nuestro grupo (Jim Waldo y yo en particular :-) que recomienda que haya excepciones controladas por el compilador. Jim era bastante convincente en sus argumentos, diciendo de un mundo en el código robusto haría reinado. Después de alguna consideración, Java se ha actualizado para haber comprobado excepciones. Sólo aquellas excepciones para que no hubo recuperación reflejan errores de aplicación sería sin control (por ejemplo, OutOfMemoryError, NullPointerException respectivamente). Y el mundo estaba a salvo otra vez.
Imagine los ingenieros de Java sorpresa cuando muchas excepciones en el API de Java y el compilador fueron cambiados de sin marcar para comprobar, y el compilador cumplir la distinción, ellos errores descubiertos en las implementaciones! Por lo tanto, los mejores esfuerzos para manejar las condiciones de error , aunque bien intencionadas, no fueron lo suficientemente buenas. Ese compilador es útil para algo :-)
4) RemoteException debe ser una excepción comprobada
Ok, por lo que volver a la pista aquí. Desde un RemoteException es un hecho de la vida en una llamada RPC (véase # 1, # 2) y comprueba excepciones le obligan a escribir el código de seguridad (# 3), pensamos que hacer RemoteException una excepción comprobada era una buena idea. Escribir programas robustos distribuidos es suficientemente difícil, sin tener el compilador para ayudar con excepciones.
Por lo tanto, algunos podrían argumentar que una RemoteException es como un OutOfMemoryError; su programa debería caer muerto si falla una llamada remota. No estoy de acuerdo con este punto. Sí, en el en algunos casos, no hay recuperación desde una RemoteException; pero si usted es escribiendo un programa distribuido confiable , su cliente necesita detectar fallas y volver a intentarlo de manera adecuada. Quizás deba ponerse en contacto con otro servidor , o cancelar una transacción de algún tipo de . Si la RemoteException no está en manejada, se filtrará y bloqueará su cliente (yuk).
Otros han declarado que hay algunas interfaces remotas que se utilizan en tanto en el caso local y la remota caso y el cliente no debería tener que trato con las excepciones de la caso local, por lo RemoteException no debería tiene que estar en una cláusula throws y no debe ser obligatorio su manejo. Ahora, si nos permitió interfaz remota métodos para omitir RemoteException y tenía un interruptor "CRIM" para generar recibos que lanzar una marcada RemoteException, el cliente tienesin opción en la materia. La decisión de el manejo de excepciones debe permanecer con el cliente. Si define una interfaz que solo arroja las excepciones no marcadas , nunca puede escribir un cliente que quiere que el compilador lo ayude a manejar las excepciones . Ya hemos visto visto en el ejemplo anterior que excepciones comprobadas fomenta el robusto código .
Otro tema que ha aparecido ahora y otra vez es que los desarrolladores necesitan para simplemente traducir las interfaces locales y los utilizan como interfaces remotas. Este puede funcionar para un pequeño conjunto de casos, pero si la interfaz no fue diseñado con concurrencia y fallo parcial y latencia llamada en mente, el protocolo capturado por la interfaz no puede ser apropiado para utilizar en el distribuido caso. ¿Se ha pasado suficiente información en para hacer que las operaciones sean idempotentes? Quizás, pero muy probablemente no.
Poner RemoteException en todos los cláusula throws puede parecer como un dolor, pero su el precio a pagar para escribir aplicaciones distribuidas robustos.
- Ann Wollrath
cómo hace la gente en un lenguaje que ni siquiera tiene el concepto de excepciones comprobadas? ¿Qué puedes hacer que no se puede hacer limpiamente en otro idioma? el problema es que las personas que consideran "fallas" sean un caso especial en lugar de darse cuenta de que el fracaso es la norma. A este tipo de personas les gustan las grandes declaraciones gigantes de GOTO que verificaron excepciones. ¿Métodos de prueba del estado? Tiempos de espera? Naaaaah. GOTOs gigantes grandes * "si los sh! T golpean al ventilador" *. Prácticamente una especificación de Java y ciertamente ** NO ** reúne a toda la comunidad de Java (por ejemplo, el marco de Spring tiene un gran odio hacia ellos). – SyntaxT3rr0r
Webinator, el chico hizo una pregunta perfectamente razonable. No hay necesidad de despotricar. – DJClayworth