Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
case class F1(x: Int, y: Int)
case class In(f1: F1, f2: Int)
case class Out(z: Int, f2: Int)
def convF1(x: F1): Try[Int] = ???
def convF2(x: Int): Try[Int] = ???
def fn(x: In): Try[Out] = {
if (x.f1.x < 0 && x.f1.y < 0)
return Failure(new Exception("x < 0 && y < 0"))
for {
z <- convF1(x.f1); if (z > 0)
f2 <- convF2(x.f2)
} yield Out(z, f2)
}
case class F1(x: Int, y: Int)
case class In(f1: F1, f2: Int)
case class Out(z: Int, f2: Int)
def convF1(x: F1): Res[Int] = ???
def convF2(x: Int): Res[Int] = ???
def fn(x: In): Res[Out] = for {
_ <- Res(x.f1.x >= 0 || x.f1.y >= 0), "x < 0 && y < 0") //работает как assert; позволяет указать сообщение об ошибке
z <- convF1(x.f1);
_ <- Res(z > 0, "z должен быть больше 0")
f2 <- convF2(x.f2)
} yield Out(z, f2)
public class Test {
public static class MyException extends Exception{
private String message;
public MyException(String message) {
super();
this.message = message;
}
public void setMessage(String message){
this.message = message;
}
public String getMessage(){
return message;
}
}
public static void main(String[] args) {
try {
A();
} catch (MyException e) {
System.out.println(e.getMessage());
}
}
public static void A() throws MyException {
try {
B();
} catch (MyException e) {
System.out.println(e.getMessage());
e.setMessage("Test2");
throw e;
}
}
public static void B() throws MyException {
throw new MyException("Test");
}
}
optional.orElseThrow(NullPointerException::new);
if (!optional.isPresent()){
throw new NullPointerException();
}
mapStrict(mapfunc)/mapStrict(mapfunc, errorfunc), который получив на входе не null, а на выходе null бросал бы nre, и иначе вовращал бы классический optional. и реализация в принципе-то не сильно сложна, да вот интересно, может можно что-то такое сделать с помощью штатных средств…optional.map(el->{
if (el.getA()==null){
throw new NullPointerException();
}
return el.getA();
});
public int getCount()
{
if(this.parent.a < 0)
this.parent.a = 42;
return count;
}
def convertPerson(p: InPerson): OutPerson = {
try {
val name = convertName(p.name)
val homeAddr = convertAddr(p.addr)
val age = convertAge(p.age)
val (id, wAddr) = db.query("select id, work_addr from persons where tel = ?", p.tel)
val workAddr = addrFromStr(wAddr)
val distance = calcAndCheckDistance(p, homeAddr, workAddr)
OutPerson(id, name, homeAddr, workAddr, distance)
} catch {
case e @ _: AddressException | _: AgeException => throw new PersonException(s"ошибка при обработке человека ${p.name}", p, e)
case e: NotFoundException => throw new PersonException(s"в базе нет данных о человеке с номером телефона ${p.tel}", p, e)
case e: ZeroDistanceExceptin => throw new PersonException(s"похоже, что человек ${p.name} живет на работе", p, e)
}
}
def calcAndCheckDistance(p: InPerson, homeAddr: Nothing, workAddr: Nothing) = {
val distance = calcDistance(homeAddr, workAddr)
if (distance == 0)
throw new ZeroDistanceExceptin()
distance
}
— по заголовку функции может быть не понятно, что функция кидает исключение;
— если ты его не отловил, то компилятор ничего не скажет;
— если ты его не отловил, то его действие распространяется на вышестоящие функции и может привести к некорректному закрытия каких-то ресурсов и повреждению данных;
Размышления о способах обработки ошибок