在Java中存在某些预定义的异常,如果抛出这些异常,则会报告发生了严重的事情,并且您可以更好地改进代码,而不是在catch块中捕获它们(如果我已正确理解它).但我仍然发现许多程序,其中包括以下内容:
} catch (IOException e) {
...
} catch (FileNotFoundException e) {
....
}
Run Code Online (Sandbox Code Playgroud)
我认为IOException和FileNotFoundException正是这种异常,我们不应该在catch块中捕获它们.为什么人们这样做?这样抓住他们会更好吗?无论如何,Java编译器都会警告这种问题.
谢谢.
ReSharper建议重新抛出异常然后,当我这样做时,它表示整个catch子句无论如何都是多余的,并建议将其删除.
我(从MethodMan使用此代码在这里):
public static DataTable ExecuteDataSet(string sql, CommandType cmdType, params SqlParameter[] parameters)
{
using (DataSet ds = new DataSet())
using (SqlConnection connStr = new SqlConnection(UsageRptConstsAndUtils.CPSConnStr))
using (SqlCommand cmd = new SqlCommand(sql, connStr))
{
cmd.CommandType = cmdType;
foreach (var item in parameters)
{
cmd.Parameters.Add(item);
}
try
{
cmd.Connection.Open();
new SqlDataAdapter(cmd).Fill(ds);
}
catch (SqlException ex)
{
throw;
}
return ds.Tables[0];
}
}
Run Code Online (Sandbox Code Playgroud)
当我在解决方案中有ReSharper Inspect> Code Issues时,它想知道"异常重新抛出可能是否有意":
catch (SqlException ex)
{
throw ex;
}
Run Code Online (Sandbox Code Playgroud)
如果我接受ReSharper的建议修复("rethrow exception"),Resharper将删除"ex":
catch (SqlException ex)
{
throw; …Run Code Online (Sandbox Code Playgroud) 我写了一段代码,以catch具体exception与帮助这个链接.它像是:
catch (SQLException sqle) {
// TODO Auto-generated catch block
String sqlMessage = sqle.getMessage();
String sqlState = sqle.getSQLState();
int vendorCode = sqle.getErrorCode();
System.out.println("Exception occurred:");
System.out.println("Message: " + sqlMessage);
System.out.println("SQL state: " + sqlState);
System.out.println("Vendor code: " + vendorCode);
}
Run Code Online (Sandbox Code Playgroud)
但我得到输出为:
java.sql.SQLException: ORA-00001: unique constraint (SYSTEM.PK_USERID) violated
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:305)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:272)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:623)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:181)
at oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java:543)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1028)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2888)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:2960)
at accessdb.Dao.insertnewuser(Dao.java:32)
at Registration.doGet(Registration.java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) …Run Code Online (Sandbox Code Playgroud) 我想要一个proc,如果它的'参数是一个Tcl 8.5及以上的字典,它会做什么.我从Tcl dict命令中找不到任何直截了当的东西.我可以使用的代码是:
proc dict? {dicty} {
expr { [catch { dict info $dicty } ] ? 0 : 1 }
}
Run Code Online (Sandbox Code Playgroud)
是否有什么不使用catch,内置的东西?
谢谢.
鉴于:
"use strict"以及以下代码:
db.connect({
host: DB_HOST,
port: DB_PORT
}).then(function(dbConn) {
console.log('DBASE connected to ' + DB_HOST + ':' + DB_PORT);
db.dbList().run(dbConn).then(function(result) {
if (result.indexOf(SCRIPT_NAME) == -1) throw new Error('unable to locate database ' + SCRIPT_NAME);
dbConn.use(SCRIPT_NAME);
console.log('DBASE bound to ' + SCRIPT_NAME + ' on ' + DB_HOST + ':' + DB_PORT);
db.tableList().run(dbConn)
.then(function(result) {
if (!result) throw new Error(SCRIPT_NAME + ' unable to enumerate tables');
if (!result.length) throw new Error(SCRIPT_NAME + ' has …Run Code Online (Sandbox Code Playgroud) 在 try catch 语句中,我们可以执行以下操作:
try{}
catch(...){}
Run Code Online (Sandbox Code Playgroud)
据我所知,...意味着任何例外。
我的问题是:为什么 C++ 标准选择这种方式(...)而不是仅仅选择这种方式()?而例如,在函数中,如果您不需要参数,您只需输入():
void foo();
Run Code Online (Sandbox Code Playgroud)
它与可变参数模板有任何关系吗?
考虑以下 Haskell 代码
try_lex_rgx :: String -> IO (Maybe [RgxToken])
try_lex_rgx rgx_str =
catch
(do
rgx_toks <- evaluate $ lex_rgx rgx_str
return $ Just rgx_toks)
(\(LexerErr err_msg remainder) -> disp_lex_error rgx_str (LexerErr err_msg remainder))
Run Code Online (Sandbox Code Playgroud)
我打算让这段代码工作的方式是评估表达式lex_rgx rgx_str,在它们发生时捕获任何异常,然后调用disp_lex_error以漂亮地打印错误。
(顺便说一下,disp_lex_error的代码如下
disp_lex_error :: String -> RgxLexerException -> IO (Maybe [RgxToken])
disp_lex_error rgx_str (LexerErr err_msg remainder) = let loc_str_frag = "In regex " ++ rgx_str ++ " at ..." in
do
hPutStrLn stderr ("Lexer error: " ++ err_msg ++ "\n" ++ …Run Code Online (Sandbox Code Playgroud) 在C#6中,您可以创建以下代码:
try { }
catch (Exception e) when (e is NullReferenceException) { }
catch (Exception e) when (e is UnauthorizedAccessException) { }
Run Code Online (Sandbox Code Playgroud)
但是上面的代码和下面的旧C#代码有什么不同?
try { }
catch (NullReferenceExceptione e) { }
catch (UnauthorizedAccessExceptione e) { }
Run Code Online (Sandbox Code Playgroud)
对我来说,旧版本看起来最短,最好用.