Melhores Práticas
(checked)
(unchecked)
(unchecked)
public class ConnectionFactory {
public Connection create() throws SQLException {
return DriverManager.getConnection(
"jdbc:mysql://localhost:3306/bd"
"usuario", "senha");
}
}
public class FooDao {
public List<Foo> getAll() {
Connection conn = ConnectionFactory.create();
// código para carregar a lista de foo
// usando conn
}
}
que que precisamos fazer?
public class FooDao {
public List<Foo> getAll() throws SQLException {
Connection conn = ConnectionFactory.create();
// código para carregar a lista de foo
// usando conn
}
}
public class FooController {
private final FooService service;
private final Canvas canvas;
public void showFoo() {
try {
List<Foo> foos = service.getAll();
canvas.show(foos);
} catch (SQLException e) {
canvas.showText("Deu problema conectando com o banco!");
}
}
}
public class FooService {
private final FooDao dao;
public List<Foo> getAll() throw SQLException {
List<Foo> foos = dao.getAll();
System.out.println("Encontrou total de " + foos.size() + " foos");
return foos;
}
}
public class FooDao {
public List<Foo> getAll() throw SQLException {
Connection conn = ConnectionFactory.create();
// código para carregar a lista de foo
// usando conn
}
}
public class FooController {
private final FooService service;
private final Canvas canvas;
public void showFoo() {
List<Foo> foos = service.getAll();
canvas.show(foos);
}
}
public class FooService {
private final FooDao dao;
public List<Foo> getAll() {
List<Foo> foos = dao.getAll();
System.out.println("Encontrou total de " + foos.size() + " foos");
return foos;
}
}
public class FooDao {
public List<Foo> getAll() {
try {
Connection conn = ConnectionFactory.create();
// código para carregar a lista de foo
} catch (SQLException e) {
return null;
}
}
}
NullPointerException
public class FooController {
private final FooService service;
private final Canvas canvas;
public void showFoo() {
List<Foo> foos = service.getAll();
canvas.show(foos);
}
}
public class FooService {
private final FooDao dao;
public List<Foo> getAll() {
List<Foo> foos = dao.getAll();
System.out.println("Encontrou total de " + foos.size() + " foos");
return foos;
}
}
public class FooDao {
public List<Foo> getAll() {
try {
Connection conn = ConnectionFactory.create();
// código para carregar a lista de foo
} catch (SQLException e) {
return new ArrayList<>();
}
}
}
Mas e se nunca tá conectando no banco?
que fazemos então?
como resolvemos?
public class DaoException extends RuntimeException {
// constructors
}
public class FooDao {
public List<Foo> getAll() {
try {
Connection conn = ConnectionFactory.create();
// código para carregar a lista de foo
} catch (SQLException e) {
throw new DaoException();
}
}
}
public class FooDao {
public List<Foo> getAll() {
try {
Connection conn = ConnectionFactory.create();
// código para carregar a lista de foo
} catch (SQLException e) {
throw new DaoException("Não foi possível pegar todos os Foos do banco!", e);
}
}
}
public Foo findById(long id) {
try {
// logica
} catch (SQLException e) {
throw new DaoException("Problema ao pegar do banco Foo com id " + id, e);
}
}
} catch (SQLException e) {
throw new DaoException("Problema no banco: " + e.getMessage());
}
} catch (SQLException e) {
throw new DaoException("Problema no banco: ", e);
}
Errado
Certo
public class FooController {
private final FooService service;
private final Canvas canvas;
public void showFoo() {
List<Foo> foos = service.getAll();
canvas.show(foos);
}
}
public class FooService {
private final FooDao dao;
public List<Foo> getAll() {
List<Foo> foos = dao.getAll();
System.out.println("Encontrou total de " + foos.size() + " foos");
return foos;
}
}
public class FooDao {
public List<Foo> getAll() {
try {
Connection conn = ConnectionFactory.create();
// código para carregar a lista de foo
} catch (SQLException e) {
throw new DaoException("Não foi possível pegar todos os Foos do banco!", e);
}
}
}
Não temos como lidar com a exceção
Último ponto antes de chegar no usuário
public class FooController {
private final FooService service;
private final Canvas canvas;
public void showFoo() {
try {
List<Foo> foos = service.getAll();
canvas.show(foos);
} catch (Throwable e) {
canvas.showText("Deu problema conectando com o banco!");
}
}
}
public class FooService {
// não podemos fazer nada sobre a exceção aqui!
}
public class FooDao {
public List<Foo> getAll() {
try {
Connection conn = ConnectionFactory.create();
// código para carregar a lista de foo
} catch (SQLException e) {
throw new DaoException("Não foi possível pegar todos os Foos do banco!", e);
}
}
}
StackOverflow
OutOfMemory
public class FooController {
private final FooService service;
private final Canvas canvas;
public void showFoo() {
try {
List<Foo> foos = service.getAll();
canvas.show(foos);
} catch (Throwable e) {
canvas.showText("Deu problema conectando com o banco!");
}
}
}
public class FooService {
// não podemos fazer nada sobre a exceção aqui!
}
public class DaoException extends RuntimeException {
// constructors
}
public class FooDao {
public List<Foo> getAll() {
try {
Connection conn = ConnectionFactory.create();
// código para carregar a lista de foo
} catch (SQLException e) {
throw new DaoException("Não foi possível pegar todos os Foos do banco!", e);
}
}
}
public class FooController {
private final FooService service;
private final Canvas canvas;
public void showFoo() {
try {
List<Foo> foos = service.getAll();
canvas.show(foos);
} catch (Exception e) {
canvas.showText("Deu problema conectando com o banco!");
}
}
}
public class FooService {
// não podemos fazer nada sobre a exceção aqui!
}
public class DaoException extends RuntimeException {
// constructors
}
public class FooDao {
public List<Foo> getAll() {
try {
Connection conn = ConnectionFactory.create();
// código para carregar a lista de foo
} catch (SQLException e) {
throw new DaoException("Não foi possível pegar todos os Foos do banco!", e);
}
}
}
Só existe exception de banco?
public class FooController {
private final FooService service;
private final Canvas canvas;
public void showFoo() {
try {
List<Foo> foos = service.getAll();
canvas.show(foos);
} catch (DaoException e) {
canvas.showText("Deu problema conectando com o banco!");
}
}
}
public class FooService {
// não podemos fazer nada sobre a exceção aqui!
}
public class DaoException extends RuntimeException {
// constructors
}
public class FooDao {
public List<Foo> getAll() {
try {
Connection conn = ConnectionFactory.create();
// código para carregar a lista de foo
} catch (SQLException e) {
throw new DaoException("Não foi possível pegar todos os Foos do banco!", e);
}
}
}
JOGUE EXCEÇÃO DA ONDE PROBLEMA OCORREU
RECUPERE ONDE PODES RESOLVER O PROBLEMA
} catch (SQLException e) {
LOGGER.error("Problema no banco!", e);
throw new DaoException(e);
}
Faça um ou o outro
public void fazAlgoCom(String arquivo) {
FileReader reader = null;
try {
reader = new FileReader(arquivo);
// do stuff
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {}
}
}
}
public void fazAlgoCom(String arquivo) {
FileReader reader = null;
try {
reader = new FileReader(arquivo);
// do stuff
} finally {
if (reader != null) {
reader.close();
}
}
}
Exceção original ficará perdida
} catch (HibernateException e) {
throw new DaoException("Nao foi possivel recuperar X do banco", e);
}
public void addUserFromFacebook(FbUser fbUser) {
User user = converter.convert(fbUser);
try {
dao.add(user);
} catch (DaoException e) {
throw new InvalidUserException("Não foi possível adicionar usuário " + user
+ " convertido do usuario do facebook " + fb, e);
}
}
public void fazAlgoCom(String arquivo) {
FileReader reader = null;
try {
reader = new FileReader(arquivo);
// do stuff
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {}
}
}
}
use try/finally quando quer que algo seja feito mesmo que dê exceção
private static final Logger LOGGER = LoggerFactory.getLogger(X.class);
public void hello(String name) {
LOGGER.info("Hello {}", name);
}
nivel
param
valor
...
LOGGER.info("Store {} with id {} and shipping type {} just disappeared in thin air! O:",
store.getName(), store.getId(), store.getShipping().getType());
...
E se store for null?
public class Store {
...
@Override
public String toString() {
return Objects.toStringHelper(this)
.add("name", this.name)
.add("id", this.id)
.add("shipping", this.shipping)
.toString();
}
...
}
...
LOGGER.info("Store {} just disappeared in thin air! O:", store);
...
DEIXE O OBJETO SABER COMO SE IMPRIMIR!
public class UserService {
public User findUser(Long userId) {
try {
return userDao.findById(userId);
} catch (DaoException e) {
LOGGER.error(e.getMessage(), e);
}
}
}
ALÉM DA LINHA, QUE INFORMAÇÃO TEMOS DO QUE ACONTECEU?
public class UserService {
public Optional<User> findUser(Long userId) {
try {
return userDao.findById(userId);
} catch (DaoException e) {
LOGGER.error("Houve problema ao tentar recuperar usuário com id {}",
userId, e);
}
}
}
2 parametros
1 argumento
void update(User user) {
try {
userDao.update(user);
} catch (DatabaseException e) {
LOGGER.error("Could not update user {}", user, e);
}
}
public void executeSearch(SearchOption searchOption, String query) {
switch (searchOption) {
case USER:
searchUser(query);
break;
default:
LOGGER.warn("Received unexpected search option! Option got: {}",
searchOption);
}
}
...
List<Threshold> thresholdsExceeded = thresholds.getExceeded(metricSample);
for (Threshold thresholdExceeded : thresholdsExceeded) {
LOGGER.info("Metric Sample {} exceeded threshold {}",
metricSample, thresholdExceeded);
...
}
...
...
LOGGER.DEBUG("Testing metric {} with thresholds {}", metricSample, thresholds);
List<Threshold> thresholdsExceeded = thresholds.getExceeded(metricSample);
for (Threshold thresholdExceeded : thresholdsExceeded) {
LOGGER.info("Metric Sample {} exceeded threshold {}",
metricSample, thresholdExceeded);
...
}
...
public PowerRanger choosePowerRangerToFight(Monster monster)
throws PowerRangerAvailabilityException {
LOGGER.trace("choosePowerRangerToFight(monster={})", monster);
for (PowerRanger ranger : alpha.getAvailablePowerRangers()) {
if (ranger.hasFightingPowerFor(monster)) {
LOGGER.trace("choosePowerRangerToFight(monster={}): {}",
monster, ranger);
return ranger;
}
}
throw new OnlyWeakPowerRangerAvailableException(monster);
}
+ detalhada
DEVE APARECER SOMENTE EM DESENVOLVIMENTO!