Java中的异常传播是否有任何指导原则?
什么时候为方法签名添加例外?例如:如果仅在缺少基本程序资源时抛出异常,并且只能在顶层处理异常,那么使用错误方法通过所有方法使用此异常将其传播到所有方法吗?
有什么好的做法吗?任何不良做法?
我很抱歉,如果我是模糊的,但我只是在寻找有关异常的编程风格的一些(一般)建议.
我一直在使用以下数据结构来表示Haskell中的命题逻辑:
data Prop
= Pred String
| Not Prop
| And Prop Prop
| Or Prop Prop
| Impl Prop Prop
| Equiv Prop Prop
deriving (Eq, Ord)
Run Code Online (Sandbox Code Playgroud)
欢迎对此结构发表任何评论.
但是,现在我想扩展我的算法来处理FOL - 谓词逻辑.什么是在Haskell中代表FOL的好方法?
我见过的版本 - 几乎是 - 上面的扩展,以及基于更经典的无上下文语法的版本.有没有关于此的文献,可以推荐吗?
haskell context-free-grammar first-order-logic data-structures
使用Hibernate,您可以将Entity类加载为:
sessionFactory = new AnnotationConfiguration()
.addPackage("test.animals")
.addAnnotatedClass(Flight.class)
.addAnnotatedClass(Sky.class)
.addAnnotatedClass(Person.class)
.addAnnotatedClass(Dog.class);
Run Code Online (Sandbox Code Playgroud)
有没有办法做同样的事情 - 以编程方式加载您的实体类 - 以符合JPA 2.0的方式?
这个问题的原因是因为我想动态加载我的Entity类,因此不一定以编程方式.
为什么Haskell实现如此专注于链表?
例如,我知道Data.Sequence对于大多数列表操作(操作除外cons)更有效,并且使用了很多; 但从语法上讲,它"几乎不受支持".Haskell在函数抽象方面投入了大量精力,例如Functor和Foldable类,但它们的语法与默认列表的语法不兼容.
如果在一个项目中我想用序列优化和替换我的列表 - 或者如果我突然想要支持无限集合,并用列表替换我的序列 - 结果代码更改是令人憎恶的.
所以我想我的疑惑可以在以下问题中具体化:
map等于(Functor f) => (a -> b) -> f a -> f b?[]和(:)函数用于,例如,Data.Sequence中的类型?我真的希望有一些解释,不包括"向后兼容性"或"它只是那种方式",但如果你认为没有,请告诉我.我们也欢迎任何相关的语言扩展.
我猜测,出于兼容性原因,vararg参数的类型Any*是Array [Any] - 如果我错了,请更正.但是,这并不能解释以下错误:
class Api(api_url: String, params: Seq[(String, String)]) {
def this(api_url: String, params: (String, String)*)
= this(api_url, params.seq)
}
Run Code Online (Sandbox Code Playgroud)
此代码无法编译,但会发出警告:
double definition:构造函数Api:(api_url:String,params:(String,String)*)Api和构造函数Api:(api_url:String,params:Seq [(String,String)])第13行的Api在擦除后具有相同的类型:(api_url:java.lang.String,params:Seq)Api
那么如何定义一个采用varargs或序列的构造函数呢?
我正在使用带注释的Hibernate,我想知道以下是否可行.
我必须设置一系列表示可以持久化的对象的接口,以及主数据库类的接口,其中包含用于持久化这些对象的若干操作(...数据库的API).
在此之下,我必须实现这些接口,并使用Hibernate持久化它们.
所以我会,例如:
public interface Data {
public String getSomeString();
public void setSomeString(String someString);
}
@Entity
public class HbnData implements Data, Serializable {
@Column(name = "some_string")
private String someString;
public String getSomeString() {
return this.someString;
}
public void setSomeString(String someString) {
this.someString = someString;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这种方法很好,有点像.当我想要嵌套实体时,麻烦来了.我想要的界面很简单:
public interface HasData {
public Data getSomeData();
public void setSomeData(Data someData);
}
Run Code Online (Sandbox Code Playgroud)
但是当我实现该类时,我可以按照下面的界面进行操作,并从Hibernate获取错误,说它不知道类"Data".
@Entity
public class HbnHasData implements HasData, Serializable {
@OneToOne(cascade = CascadeType.ALL)
private Data someData;
public Data getSomeData() {
return …Run Code Online (Sandbox Code Playgroud) 我发现这个创建自己的哈尔分类级联教程.
这向我提出了一个问题:运行HaarTraining和创建自己的分类器(与使用OpenCv提供的级联相反)有什么好处(如果有的话)?
更新:
我已经放弃了CodeIgniter,并希望从PHP构建一个围绕我的数据库应用程序的Web界面,因为没有办法摆脱这个bug ...
我得到这个例外:
Fatal error: require_once(): Cannot redeclare class doctrine\orm\abstractquery in Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php on line 190
Call Stack:
0.0007 330016 1. {main}() Q:\Digest\index.php:0
0.0058 330800 2. require_once('Q:\Digest\lib\CodeIgniter\core\CodeIgniter.php') Q:\Digest\index.php:163
0.2207 935856 3. call_user_func_array() Q:\Digest\lib\CodeIgniter\core\CodeIgniter.php:297
0.2207 935904 4. Crud->index() Q:\Digest\lib\CodeIgniter\core\CodeIgniter.php:0
0.2574 1065064 5. Crud->__getEntities() Q:\Digest\Application\controllers\crud.php:19
0.2649 1121824 6. Doctrine\ORM\AbstractQuery->getResult() Q:\Digest\Application\controllers\crud.php:49
0.2649 1121976 7. Doctrine\ORM\AbstractQuery->execute() Q:\Digest\lib\Doctrine\ORM\AbstractQuery.php:366
0.2651 1121976 8. Doctrine\ORM\Query->_doExecute() Q:\Digest\lib\Doctrine\ORM\AbstractQuery.php:528
0.2651 1121976 9. Doctrine\ORM\Query->_parse() Q:\Digest\lib\Doctrine\ORM\Query.php:223
0.2848 1185896 10. Doctrine\ORM\Query\Parser->parse() Q:\Digest\lib\Doctrine\ORM\Query.php:203
0.3089 1238704 11. Doctrine\ORM\Query\SqlWalker->getExecutor() Q:\Digest\lib\Doctrine\ORM\Query\Parser.php:311
0.3090 1239104 12. Symfony\Component\HttpFoundation\UniversalClassLoader->loadClass() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:0 …Run Code Online (Sandbox Code Playgroud) 考虑以下实体类,例如,与EclipseLink 2.0.2一起使用 - 其中link属性不是主键,但仍然是唯一的.
@Entity
public class Profile {
@Id
private Long id;
@Column(unique = true)
private String link;
// Some more attributes and getter and setter methods
}
Run Code Online (Sandbox Code Playgroud)
当我插入具有该link属性的重复值的记录时,EclipseLink不会抛出a EntityExistsException,而是抛出a DatabaseException,并显示消息,说明违反了唯一约束.
这似乎不是很有用,因为没有一种简单的,独立于数据库的方法来捕获此异常.处理这个问题的建议方法是什么?
我考虑过的一些事情是:
DatabaseException- 我担心这个错误代码是数据库的本机错误代码;Profile具有特定值的a的存在link- 这显然会导致大量多余的查询.我在JavaWorld上发现了这篇文章,其中Allen Holub解释了Getters/Setters的替代方法,它保留了隐藏对象实现的原则(他的示例代码也可以在下面找到).
它解释了类Name/ EmployeeId/ Money应该有一个构造函数接受一个字符串 - 原因是如果你输入它int,然后需要将它改为a long,你将不得不修改类的所有用途,并且你不需要这种模式.
我想知道:这不是简单地将问题转移到解析String被抛出的参数吗?例如,如果所有使用EmployeeId(从中接收Exporter)的代码解析String成一个int,并且突然开始导出long值,则需要完全修改使用的数量......如果你开始解析long它可能就好了改为a double(即使这对id没有意义)......如果你不能确定要解析什么String,你就无法实现任何东西.
除了这个问题,我还有另一个问题:我意识到这篇文章已有七年多的历史了,所以有人能指出我最近关于OO设计的一些概述,特别是关于getter/setter和实现隐藏辩论的想法吗?
public class Employee
{ private Name name;
private EmployeeId id;
private Money salary;
public interface Exporter
{ void addName ( String name );
void addID ( String id );
void addSalary ( String salary ); …Run Code Online (Sandbox Code Playgroud) java ×5
haskell ×2
builder ×1
collections ×1
constructor ×1
doctrine-orm ×1
dynamic ×1
eclipselink ×1
entities ×1
exception ×1
fatal-error ×1
hibernate ×1
interface ×1
jpa ×1
jpa-2.0 ×1
oop ×1
opencv ×1
php ×1
scala ×1
symfony1 ×1
try-catch ×1
types ×1