小编wro*_*ite的帖子

为什么SetUnhandledExceptionFilter无法捕获一些异常,但AddVectoredExceptionHandler可以做到

我遇到了一个问题,即当异常代码c0000374引发时,我传递给SetUnhandledExceptionFilter的函数没有被调用.但它可以正常使用异常代码c0000005.然后我尝试使用AddVectoredExceptionHandler,它没有问题,处理函数被正确调用.

这是API错误吗?我可以在任何地方使用AddVectoredExceptionHandler而不是SetUnhandledExceptionFilter吗?

这两个功能都能正常工作

// Exception code c0000005
int* p1 = NULL;
*p1 = 99;
Run Code Online (Sandbox Code Playgroud)

只有AddVectoredExceptionHandler才能捕获此异常.(为了证明它不依赖于运行时库,我手动引发异常并且结果相同.)

// Exception code c0000374
RaiseException(0xc0000374, 0, 0, NULL);
Run Code Online (Sandbox Code Playgroud)

测试程序.

#include <tchar.h>
#include <fstream>
#include <Windows.h>

LONG WINAPI VectoredExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
    std::ofstream f;
    f.open("VectoredExceptionHandler.txt", std::ios::out | std::ios::trunc);
    f << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
    f.close();

    return EXCEPTION_CONTINUE_SEARCH;
}

LONG WINAPI TopLevelExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
    std::ofstream f;
    f.open("TopLevelExceptionHandler.txt", std::ios::out | std::ios::trunc);
    f << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
    f.close();

    return EXCEPTION_CONTINUE_SEARCH;
}


int _tmain(int …
Run Code Online (Sandbox Code Playgroud)

c++ windows winapi exception-handling

23
推荐指数
2
解决办法
2万
查看次数

Simple Injector是否可以通过对象工厂注册RegisterConditional?

我看到Simple Injector的Container有这种方法

public void RegisterConditional<TService, TImplementation>(
    Predicate<PredicateContext> predicate
)
Run Code Online (Sandbox Code Playgroud)

但是我想为不同的服务使用相同实现的不同对象,所以我需要的重载方法看起来像这样

public void RegisterConditional<TService>(
    Func<TService> instanceCreator,
    Predicate<PredicateContext> predicate
)
Run Code Online (Sandbox Code Playgroud)

但SimpleInjector没有它.我正在尝试找到其他Container的方法来注册具有服务条件的实例创建者.还有其他方法吗?

或者,我正在努力做的不是好的设计,所以开发人员不实现它?

编辑:添加了示例和更详细的问题.

class CSVFileScanner
{
    public CSVFileScanner(IFileLocator fileLocator) { }
}

class XMLFileScanner
{
    public XMLFileScanner(IFileLocator fileLocator) { }
}

class DefaultLogFileLocator: ILogFileLocator
{
    public DefaultLogFileLocator(string directoryPath, string searchPattern) { }
}

var locatorForCSVFileScanner = new DefaultLogFileLocator("C:\CSVLogDir", "*.csv")
var locatorForXMLFileScanner = new DefaultLogFileLocator("C:\XMLLogDir", "*.xml")
Run Code Online (Sandbox Code Playgroud)

从示例源代码,我怎么能注册他们得到 locatorForCSVFileScanner传递给对象CSVFileScanner时,构造CSVFileScanner越来越创建并locatorForXMLFileScanner传递给对象XMLFileScanner构造函数时XMLFileScanner得到产生的?

.net dependency-injection ioc-container simple-injector

8
推荐指数
1
解决办法
873
查看次数