class SimpanGagalException extends RuntimeException {
    SimpanGagalException(String pesan, Throwable cause) {
        super(pesan, cause);
    }
}

public class BungkusDanLanjut {
    static void simpanProfil(String nama) {
        try {
            simpanKePenyimpanan(nama);
            System.out.println("profil " + nama + " tersimpan");
        } catch (IllegalStateException e) {
            System.out.println("log: kegagalan penyimpanan untuk " + nama);
            throw new SimpanGagalException("gagal menyimpan profil " + nama, e);
        }
    }

    static void simpanKePenyimpanan(String nama) {
        throw new IllegalStateException("penyimpanan tidak siap");
    }

    public static void main(String[] args) {
        try {
            simpanProfil("Budi");
        } catch (SimpanGagalException e) {
            System.out.println("lapisan atas menerima: " + e.getMessage());
            System.out.println("penyebab teknis: " + e.getCause().getMessage());
        }
    }
}
