Capturar excecões

Olá,

alguém poderia me explicar quando usar throws e throw, quando estiver trabalhando com tratamento de erros? eu desejava fazer o código assim:

public static Connection getConnection(){
		try{
			Class.forName("com.mysql.jdbc.Driver");
			return DriverManager.getConnection("jdbc:mysql://localhost/teste","root","");
		}catch(ClassNotFoundException e){
			e.getMessage();
		}catch(SQLException e){
			e.getMessage();
		}
	}

mas ele só funcionou assim:

public static Connection getConnection()throws SQLException{
		try{
			Class.forName("com.mysql.jdbc.Driver");
			return DriverManager.getConnection("jdbc:mysql://localhost/teste","root","");
		}catch(ClassNotFoundException e){
			throw new SQLException(e.getMessage());
		}
	}

quem puder me dar um help…por favor…

Nessa parte:

public static Connection getConnection(){
		try{
			Class.forName("com.mysql.jdbc.Driver");
			return DriverManager.getConnection("jdbc:mysql://localhost/teste","root","");
		}catch(ClassNotFoundException e){
			e.getMessage();
		}catch(SQLException e){
			e.getMessage();
		}
	}

O erro ocorre por vc não retornar nada caso alguma excessão seja lançada, é preciso garantir ao método um retorno, o correto seria:

public static Connection getConnection() {
		Connection conexao = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conexao = DriverManager.getConnection("jdbc:mysql://localhost/teste", "root", "");
		} catch (ClassNotFoundException e) {
			e.getMessage();
		} catch (SQLException e) {
			e.getMessage();
		}
		return conexao;
	}

Nesse aqui:

public static Connection getConnection()throws SQLException{
		try{
			Class.forName("com.mysql.jdbc.Driver");
			return DriverManager.getConnection("jdbc:mysql://localhost/teste","root","");
		}catch(ClassNotFoundException e){
			throw new SQLException(e.getMessage());
		}
	}

Funciona pois caso ocorra alguma excessão, vc lança a mesma para o responsável que chamou este método.

Throws - indica para quem irá chamar o método que é possível que uma excessão seja lançada, assim ela irá trata-la com um try/catch ou lança-la pra frente.

[]'s

[quote=lcegatti]Nessa parte:

public static Connection getConnection(){
		try{
			Class.forName("com.mysql.jdbc.Driver");
			return DriverManager.getConnection("jdbc:mysql://localhost/teste","root","");
		}catch(ClassNotFoundException e){
			e.getMessage();
		}catch(SQLException e){
			e.getMessage();
		}
	}

O erro ocorre por vc não retornar nada caso alguma excessão seja lançada, é preciso garantir ao método um retorno, o correto seria:

public static Connection getConnection() {
		Connection conexao = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conexao = DriverManager.getConnection("jdbc:mysql://localhost/teste", "root", "");
		} catch (ClassNotFoundException e) {
			e.getMessage();
		} catch (SQLException e) {
			e.getMessage();
		}
		return conexao;
	}

[/quote]

Não. Isso não é correto. O retorno é apenas um e dentro do try. O que está erra ali é um e.getMessage que não serve para nada
Esta classe obtem coneções e deve pertencer a uma camada de integração. Essa camada tem um nome, digamos que XPTO
Então o tratamento correto seria:

public static Connection getConnection() throw XPTOException {
		Connection conexao = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			return  DriverManager.getConnection("jdbc:mysql://localhost/teste", "root", "");
		} catch (ClassNotFoundException e) {
			throw new XPTOException (e);
		} catch (SQLException e) {
			throw new XPTOException (e);
		}
	}

Voce pode melhorar isso. A primeira exceção só acontece se o cara configurou as coisas de forma errada
nesse caso Poderiamos ter uma XPTOConfigurationException filha de XPTOException e fazer assim

public static Connection getConnection() throw XPTOException {
		Connection conexao = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			return  DriverManager.getConnection("jdbc:mysql://localhost/teste", "root", "");
		} catch (ClassNotFoundException e) {
			throw new XPTOConfigurationException (e);
		} catch (SQLException e) {
			throw new XPTOException (e);
		}
	}

XPTOException pode ser não verificada sem problemas.
So para reforçar : XPTO é o nome da camada. Se a camada se chamar dao então seria DAOException
se se chamar BDAccess seria DBAcessException e assim vai…

Entendido :thumbup:

[]'s

obrigada a todos. mais uma dúvida: o throw seria então um modo de , digamos, “detalhar” mais o erro?

throw vc lanca a excecao. E throws vc passa a bola para quem chamou! Ou seja, quem me chamou que trate minha excecao…

blz, valeu pelas dicas. e qual seria o mais indicado? tratar no proprio método ou deixar isso pra quem fizer a chamada?

Dá uma lida nesse post do Luca:

http://lucabastos.blogspot.com/2007/06/tratamento-de-excees-parte-2-mudanas-no.html

muito boa dica. obrigada:D