我正在创建一个C#应用程序,并尝试在适当时利用自定义异常.我在这里和MSDN设计指南中查看了其他问题,但没有遇到任何具体的问题,我在这里想知道.
如何组织自定义例外的最佳做法是什么?
例如,我有一个类Disk抛出一个InvalidDiskException.Disk是唯一抛出此异常的类.
目前,我有异常嵌套在Disk.cs文件中,如下所示:
Disk.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace OrganizingExceptionsInCSharp
{
class Disk
{
[Serializable]
public class InvalidDiskException : Exception
{
public InvalidDiskException() { }
public InvalidDiskException(string message) : base(message) { }
public InvalidDiskException(string message, Exception innerException) : base(message, innerException) { }
}
//
// Code that throws the exception.
//
}
}
Run Code Online (Sandbox Code Playgroud)
是否应该将异常定义在与磁盘相同的级别(即未嵌套在内)?该异常应该嵌套在磁盘中,但保留它自己的部分文件吗?可能还有其他更好的选择吗?如果还有其他我没有想过的考虑因素,请告诉我.
我正在编写ac#application,它使用自动化来控制另一个程序.当然,该程序必须运行才能使我的程序正常运行.当我的程序查找应用程序但找不到它时,我想抛出异常(现在我可以尝试打开应用程序,或者告诉用户打开它,或者......).
我应该实现自定义异常 - 还是使用现有的NotSupportedException(或其他.NET异常之一).如果是自定义异常,你会建议什么?我正在考虑实现一个自定义异常我称之为MyAppNameException然后只是使用该消息来声明问题是什么?
在那里的方式,让你的程序更具可读性和用户友好的抛出异常的一般规则,还是我只是给这个太多心思:)?
谢谢!
我来自Ruby和Java背景,最近开始探索C++.
虽然我通过简单地继承异常类来创建自定义异常的初始尝试失败了,但是我发现在网站上发布了以下示例:
class Exception : public exception
{
public:
Exception(string m="exception!") : msg(m) {}
~Exception() throw() {}
const char* what() const throw() { return msg.c_str(); }
private:
string msg;
};
Run Code Online (Sandbox Code Playgroud)
我对C++语义的理解目前还不是很成熟,我希望能够更好地理解这里发生的事情.
在声明const char* what() const throw()中该部分的作用是const throw()什么,以及它是什么样的编程结构?
另外,throw()析构函数规范的目的和意图是什么~Exception(),为什么我需要有一个析构函数规范,虽然我不需要它特别做某事?不应该destructor继承异常就足够了吗?
我不确定我的自定义异常方法是否正确.我想要做的是抛出自定义消息的异常,但似乎我创建了内存泄漏...
class LoadException: public std::exception {
private:
const char* message;
public:
LoadException(const std::string message);
virtual const char* what() const throw();
};
LoadException::LoadException(const std::string message) {
char* characters = new char[message.size() + 1];
std::copy(message.begin(), message.end(), characters);
characters[message.size()] = '\0';
this->message = characters;
}
Run Code Online (Sandbox Code Playgroud)
我用它如下:
void array_type_guard(Local<Value> obj, const std::string path) {
if (!obj->IsArray()) {
throw LoadException(path + " is not an array");
}
}
try {
objects = load_objects();
} catch (std::exception& e) {
ThrowException(Exception::TypeError(String::New(e.what())));
return scope.Close(Undefined());
}
Run Code Online (Sandbox Code Playgroud)
我担心在构造函数中创建的数组永远不会被删除.但我不确定如何删除它 - 我应该添加析构函数还是使用完全不同的方法? …
我有一个自定义异常过滤器,我通过向我的类添加[CustomExceptionFilter]属性来调用.它按照我的意愿工作,但是如果action方法返回一个局部视图(通过ajax请求),异常(基本上是一个重定向到一个未授权的页面),正在加载部分视图页.有没有办法可以强制它重新加载'父'网址?
以下是自定义异常过滤器的代码
public class CustomExceptionFilter : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
if (filterContext.Exception.GetType() == typeof(CustomSecurityException))
{
filterContext.ExceptionHandled = true;
RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData);
string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "NoAccess", action = "Index", message = filterContext.Exception.Message })).VirtualPath;
filterContext.HttpContext.Response.Redirect(url, true);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我创建了一个自定义异常类,如下所示
namespace testingEXception
{
public class CustomException : Exception
{
public CustomException()
{
}
public CustomException(string message)
: base(message)
{
}
public CustomException(string message, Exception innerException)
: base(message, innerException)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在相同的解决方案中从另一个项目抛出异常
namespace ConsoleApplication1
{
public class testClass
{
public void compare()
{
if (1 > 0)
{
throw new CustomException("Invalid Code");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样抓住它
namespace testingEXception
{
class Program
{
static void Main(string[] args)
{
try
{
testClass obj = new testClass();
obj.compare();
}
catch …Run Code Online (Sandbox Code Playgroud) 我不知道为什么IllegalArgumentException不类需要被逮住或声明,而其他的异常有(例如java.net.MalformedURLException)。
public void foo() {
throw new IllegalArgumentException("spam");
}
public void bar() throws MalformedURLException { // required
throw new MalformedURLException("ham");
}
Run Code Online (Sandbox Code Playgroud)
我知道Errors 不必声明,因为它们不打算被捕获。
我想声明一个新的异常,它也不需要被捕获。
我有一个自定义异常(在可能的其他自定义异常中进一步扩展)。我的项目需要记录发生的所有 customExceptions(及其所有后代)。我有一个可以记录 customException(和其他任何东西)的记录器。这样做的一种方法是在如下处理异常时显式记录异常。
try{
//some exception occur
}
catch(customeException $e)
{
$log->logException($e);
$e->showMessage(); // or do anything that we have to do with the error.
}
Run Code Online (Sandbox Code Playgroud)
由于我们正在记录所有 customExceptions,我能想到的另一种方式是更新 customException 构造函数并在构造函数内部记录异常。通过这种方式,它确保记录所有 customException。但是,如果我们走这条路,我的问题是:
php logging exception-handling custom-exceptions exception-logging