¿Cuál es la diferencia entre `raise“ foo ”` y `raise Exception.new (“ foo ”)`?

¿Cuál es la diferencia: técnica, filosófica, conceptual o de otro tipo?

raise "foo" 

y

 raise Exception.new("foo") 

?

Técnicamente, el primero genera un RuntimeError con el mensaje establecido en "foo" , y el segundo genera una excepción con el mensaje establecido en "foo" .

En la práctica, hay una diferencia significativa entre cuándo querría usar el primero y cuándo desea usar el último.

En pocas palabras, es probable que desee un RuntimeError no una Exception . Un bloque de rescate sin un argumento capturará RuntimeErrors , pero NO capturará Exception s. Entonces, si elevas una Exception en tu código, este código no lo detectará:

 begin rescue end 

Para poder capturar la Exception tendrás que hacer esto:

 begin rescue Exception end 

Esto significa que, en cierto sentido, una Exception es un error “peor” que un RuntimeError , porque tiene que hacer más trabajo para recuperarse de ella.

Así que lo que quieras depende de cómo tu proyecto haga su manejo de errores. Por ejemplo, en nuestros demonios, el ciclo principal tiene un rescate en blanco que capturará RuntimeErrors , los informará y luego continuará. Pero en una o dos circunstancias, queremos que el demonio realmente muera por un error, y en ese caso generamos una Exception , que pasa directamente a través de nuestro “código normal de manejo de errores” y se elimina.

Y nuevamente, si está escribiendo el código de la biblioteca, probablemente desee un RuntimeError , no una Exception , ya que los usuarios de su biblioteca se sorprenderán si genera errores que un bloque de rescue blanco no puede detectar, y les tomará un momento darse cuenta de por qué

Finalmente, debo decir que RuntimeError es una subclase de la clase StandardError , y la regla real es que, aunque puede raise cualquier tipo de objeto, el rescue blanco solo capturará por defecto cualquier cosa que herede de StandardError . Todo lo demás tiene que ser específico.

De la documentación oficial:

 raise raise( string ) raise( exception [, string [, array ] ] ) 

Sin argumentos, sube la excepción en $! o levanta un RuntimeError si $! es nulo Con un solo argumento de String , genera un RuntimeError con la cadena como un mensaje. De lo contrario, el primer parámetro debe ser el nombre de una clase de Exception (o un objeto que devuelve una Exception cuando se envía una excepción). El segundo parámetro opcional establece el mensaje asociado con la excepción, y el tercer parámetro es una matriz de información de callback. Las excepciones son capturadas por la cláusula de rescate de los bloques de begin...end .

 raise "Failed to create socket" raise ArgumentError, "No parameters", caller