Movatterモバイル変換


[0]ホーム

URL:


D Logo
Menu
Search

Library Reference

version 2.112.0

overview

Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page.Requires a signed-in GitHub account. This works well for small changes.If you'd like to make larger changes you may want to consider usinga local clone.

std.exception

This module defines functions related to exceptions and general error handling. It also defines functions intended to aid in unit testing.
CategoryFunctions
AssumptionsassertNotThrownassertThrownassumeUniqueassumeWontThrowmayPointTo
EnforcedoesPointToenforceerrnoEnforce
HandlerscollectExceptioncollectExceptionMsgifThrownhandle
OtherbasicExceptionCtorsemptyExceptionMsgErrnoExceptionRangePrimitive
License:
Boost License 1.0
Authors:
Andrei Alexandrescu andJonathan M Davis

Sourcestd/exception.d

Examples:
Synopis
import core.stdc.stdlib : malloc, free;import std.algorithm.comparison : equal;import std.algorithm.iteration : map, splitter;import std.algorithm.searching : endsWith;import std.conv : ConvException, to;import std.range : front, retro;// use enforce like assertint a = 3;enforce(a > 2,"a needs to be higher than 2.");// enforce can throw a custom exceptionenforce!ConvException(a > 2,"a needs to be higher than 2.");// enforce will return it's inputenum size = 42;auto memory = enforce(malloc(size),"malloc failed")[0 .. size];scope(exit) free(memory.ptr);// collectException can be used to test for exceptionsException e = collectException("abc".to!int);assert(e.file.endsWith("conv.d"));// and just for the exception messagestring msg = collectExceptionMsg("abc".to!int);writeln(msg);// "Unexpected 'a' when converting from type string to type int"// assertThrown can be used to assert that an exception is thrownassertThrown!ConvException("abc".to!int);// ifThrown can be used to provide a default value if an exception is thrownwriteln("x".to!int().ifThrown(0));// 0// handle is a more advanced version of ifThrown for rangesauto r ="12,1337z32,54".splitter(',').map!(a => to!int(a));auto h = r.handle!(ConvException, RangePrimitive.front, (e, r) => 0);assert(h.equal([12, 0, 54]));assertThrown!ConvException(h.retro.equal([54, 0, 12]));// basicExceptionCtors avoids the boilerplate when creating custom exceptionsstaticclass MeaCulpa : Exception{mixin basicExceptionCtors;}e = collectException((){thrownew MeaCulpa("diagnostic message");}());writeln(e.msg);// "diagnostic message"writeln(e.file);// __FILE__writeln(e.line);// __LINE__ - 3// assumeWontThrow can be used to cast throwing code into `nothrow`void exceptionFreeCode()nothrow{// auto-decoding only throws if an invalid UTF char is given    assumeWontThrow("abc".front);}// assumeUnique can be used to cast mutable instance to an `immutable` one// use with carechar[] str ="  mutable".dup;str[0 .. 2] ="im";immutable res = assumeUnique(str);writeln(res);// "immutable"
autoassertNotThrown(T : Throwable = Exception, E)(lazy Eexpression, stringmsg = null, stringfile = __FILE__, size_tline = __LINE__);
Asserts that the given expression doesnot throw the given type ofThrowable. If aThrowable of the given type is thrown, it is caught and does not escape assertNotThrown. Rather, anAssertError is thrown. However, any otherThrowables will escape.
Parameters:
TTheThrowable to test for.
EexpressionThe expression to test.
stringmsgOptional message to output on test failure. If msg is empty, and the thrown exception has a non-empty msg field, the exception's msg field will be output on test failure.
stringfileThe file where the error occurred. Defaults to__FILE__.
size_tlineThe line where the error occurred. Defaults to__LINE__.
Throws:
AssertError if the givenThrowable is thrown.
Returns:
the result ofexpression.
Examples:
import core.exception : AssertError;import std.string;assertNotThrown!StringException(enforce!StringException(true,"Error!"));//Exception is the default.assertNotThrown(enforce!StringException(true,"Error!"));assert(collectExceptionMsg!AssertError(assertNotThrown!StringException(           enforce!StringException(false,"Error!"))) ==`assertNotThrown failed: StringException was thrown: Error!`);
voidassertThrown(T : Throwable = Exception, E)(lazy Eexpression, stringmsg = null, stringfile = __FILE__, size_tline = __LINE__);
Asserts that the given expression throws the given type ofThrowable. TheThrowable is caught and does not escape assertThrown. However, any otherThrowableswill escape, and if noThrowable of the given type is thrown, then anAssertError is thrown.
Parameters:
TTheThrowable to test for.
EexpressionThe expression to test.
stringmsgOptional message to output on test failure.
stringfileThe file where the error occurred. Defaults to__FILE__.
size_tlineThe line where the error occurred. Defaults to__LINE__.
Throws:
AssertError if the givenThrowable is not thrown.
Examples:
import core.exception : AssertError;import std.string;assertThrown!StringException(enforce!StringException(false,"Error!"));//Exception is the default.assertThrown(enforce!StringException(false,"Error!"));assert(collectExceptionMsg!AssertError(assertThrown!StringException(           enforce!StringException(true,"Error!"))) ==`assertThrown failed: No StringException was thrown.`);
templateenforce(E : Throwable = Exception) if (is(typeof(new E("", string.init, size_t.init)) : Throwable) || is(typeof(new E(string.init, size_t.init)) : Throwable))

Tenforce(T, Dg, string file = __FILE__, size_t line = __LINE__)(Tvalue, scope Dgdg)
if (isSomeFunction!Dg && is(typeof(dg())) && is(typeof((){if (!value){}})));

Tenforce(T)(Tvalue, lazy Throwableex);
Enforces that the given value is true. If the given value is false, an exception is thrown. The
  • msg - error message as astring
  • dg - custom delegate that return a string and is only called if an exception occurred
  • ex - custom exception to be thrown. It islazy and is only created if an exception occurred
Parameters:
TvalueThe value to test.
EException type to throw if the value evaluates to false.
const(char)[] msgThe error message to put in the exception if it is thrown.
DgdgThe delegate to be called if the value evaluates to false.
ThrowableexThe exception to throw if the value evaluates to false.
string fileThe source file of the caller.
size_t lineThe line number of the caller.
Returns:
value, ifcast(bool)value is true. Otherwise, depending on the chosen overload,new Exception(msg),dg() orex is thrown.
Note:enforce is used to throw exceptions and is therefore intended to aid in error handling. It isnot intended for verifying the logic of your program - that is whatassert is for.
Do not useenforce inside of contracts (i.e. inside ofin andout blocks andinvariants), because contracts are compiled out when compiling with-release.
If a delegate is passed, the safety and purity of this function are inferred fromDg's safety and purity.
Examples:
import core.stdc.stdlib : malloc, free;import std.conv : ConvException, to;// use enforce like assertint a = 3;enforce(a > 2,"a needs to be higher than 2.");// enforce can throw a custom exceptionenforce!ConvException(a > 2,"a needs to be higher than 2.");// enforce will return it's inputenum size = 42;auto memory =enforce(malloc(size),"malloc failed")[0 .. size];scope(exit) free(memory.ptr);
Examples:
assertNotThrown(enforce(true,new Exception("this should not be thrown")));assertThrown(enforce(false,new Exception("this should be thrown")));
Examples:
writeln(enforce(123));// 123try{enforce(false,"error");assert(false);}catch (Exception e){    writeln(e.msg);// "error"    writeln(e.file);// __FILE__    writeln(e.line);// __LINE__ - 7}
Examples:
Alias your own enforce function
import std.conv : ConvException;alias convEnforce =enforce!ConvException;assertNotThrown(convEnforce(true));assertThrown!ConvException(convEnforce(false,"blah"));
Tenforce(T)(Tvalue, lazy const(char)[]msg = null, stringfile = __FILE__, size_tline = __LINE__)
if (is(typeof((){if (!value){}})));
aliaserrnoEnforce = enforce!(ErrnoException).enforce(T)(T value, lazy const(char)[] msg = null, string file = __FILE__, size_t line = __LINE__) if (is(typeof((){if (!value){}})));
Enforces that the given value is true, throwing anErrnoException if it is not.
Parameters:
T valueThe value to test.
const(char)[] msgThe message to include in theErrnoException if it is thrown.
Returns:
value, ifcast(bool) value is true. Otherwise,new ErrnoException(msg) is thrown. It is assumed that the last operation seterrno to an error code corresponding with the failed condition.
Examples:
import core.stdc.stdio : fclose, fgets, fopen;import std.file : thisExePath;import std.string : toStringz;auto f = fopen(thisExePath.toStringz,"r").errnoEnforce;scope(exit) fclose(f);char[100] buf;auto line = fgets(buf.ptr, buf.length, f);enforce(line !isnull);// expect a non-empty line
TcollectException(T = Exception, E)(lazy Eexpression, ref Eresult);
Catches and returns the exception thrown from the given expression. If no exception is thrown, then null is returned andresult is set to the result of the expression.
Note that whilecollectExceptioncan be used to collect anyThrowable and not justExceptions, it is generally ill-advised to catch anything that is neither anException nor a type derived fromException. So, do not usecollectException to collect non-Exceptions unless you're sure that that's what you really want to do.
Parameters:
TThe type of exception to catch.
EexpressionThe expression which may throw an exception.
EresultThe result of the expression if no exception is thrown.
Examples:
int b;int foo() {thrownew Exception("blah"); }assert(collectException(foo(), b));version (D_NoBoundsChecks) {}else{// check for out of bounds errorint[] a =newint[3];import core.exception : RangeError;assert(collectException!RangeError(a[4], b));}
TcollectException(T : Throwable = Exception, E)(lazy Eexpression);
Catches and returns the exception thrown from the given expression. If no exception is thrown, then null is returned.E can bevoid.
Note that whilecollectExceptioncan be used to collect anyThrowable and not justExceptions, it is generally ill-advised to catch anything that is neither anException nor a type derived fromException. So, do not usecollectException to collect non-Exceptions unless you're sure that that's what you really want to do.
Parameters:
TThe type of exception to catch.
EexpressionThe expression which may throw an exception.
Examples:
int foo() {thrownew Exception("blah"); }writeln(collectException(foo()).msg);// "blah"
stringcollectExceptionMsg(T = Exception, E)(lazy Eexpression);
Catches the exception thrown from the given expression and returns the msg property of that exception. If no exception is thrown, then null is returned.E can bevoid.
If an exception is thrown but it has an empty message, thenemptyExceptionMsg is returned.
Note that whilecollectExceptionMsgcan be used to collect anyThrowable and not justExceptions, it is generally ill-advised to catch anything that is neither anException nor a type derived fromException. So, do not usecollectExceptionMsg to collect non-Exceptions unless you're sure that that's what you really want to do.
Parameters:
TThe type of exception to catch.
EexpressionThe expression which may throw an exception.
Examples:
void throwFunc() {thrownew Exception("My Message."); }writeln(collectExceptionMsg(throwFunc()));// "My Message."void nothrowFunc() {}assert(collectExceptionMsg(nothrowFunc())isnull);void throwEmptyFunc() {thrownew Exception(""); }writeln(collectExceptionMsg(throwEmptyFunc()));// emptyExceptionMsg
enum stringemptyExceptionMsg;
Value that collectExceptionMsg returns when it catches an exception with an empty exception message.
pure nothrow immutable(T)[]assumeUnique(T)(T[]array);

pure nothrow immutable(T)[]assumeUnique(T)(ref T[]array);

pure nothrow immutable(T[U])assumeUnique(T, U)(ref T[U]array);
Casts a mutable array to an immutable array in an idiomaticmanner. Technically,assumeUnique just inserts a cast,but its name documents assumptions on the part of thecaller.assumeUnique(arr) should only be called whenthere are no more active mutable aliases to elements ofarr. To strengthen this assumption,assumeUnique(arr)also clearsarr before returning. EssentiallyassumeUnique(arr) indicates commitment from the caller that thereis no more mutable access to any ofarr's elements(transitively), and that all future accesses will be done throughthe immutable array returned byassumeUnique.
Typically,assumeUnique is used to return arrays fromfunctions that have allocated and built them.
Parameters:
T[]arrayThe array to cast to immutable.
Returns:
The immutable array.

Example

string letters(){char[] result =newchar['z' - 'a' + 1];foreach (i,ref e; result)  {    e =cast(char)('a' + i);  }returnassumeUnique(result);}
The use in the example above is correct becauseresultwas private toletters and the memory it referenced can no longer be written toafter the function returns. The following example shows anincorrect use ofassumeUnique.

Bad

char[] buffer;string letters(char first,char last){if (first >= last)returnnull;// fineauto sneaky = buffer;  sneaky.length = last - first + 1;foreach (i,ref e; sneaky)  {    e =cast(char)('a' + i);  }returnassumeUnique(sneaky);// BAD}
The example above wreaks havoc on client code because it modifies thereturned array that the previous caller considered immutable. To obtain animmutable array from the writable arraybuffer, replacethe last line with:
return to!(string)(sneaky);// not that sneaky anymore
Theto call will duplicate the array appropriately.
Note: Checking for uniqueness during compilation ispossible in certain cases, especially when a function ismarked (or inferred) aspure. The following example does notneed to callassumeUnique because the compiler can infer theuniqueness of the array in the pure function:
static string letters()pure{char[] result =newchar['z' - 'a' + 1];foreach (i,ref e; result)  {    e =cast(char)('a' + i);  }return result;}
For more on infering uniqueness see theunique andlent keywords in theArchJavalanguage.
The downside of usingassumeUnique'sconvention-based usage is that at this time there is noformal checking of the correctness of the assumption;on the upside, the idiomatic use ofassumeUnique issimple and rare enough to be tolerable.

Examples:
int[] arr =newint[1];auto arr1 = arr.assumeUnique;staticassert(is(typeof(arr1) ==immutable(int)[]));writeln(arr);// nullwriteln(arr1);// [0]
Examples:
int[string] arr = ["a":1];auto arr1 = arr.assumeUnique;staticassert(is(typeof(arr1) ==immutable(int[string])));writeln(arr);// nullwriteln(arr1.keys);// ["a"]
nothrow TassumeWontThrow(T)(lazy Texpr, stringmsg = null, stringfile = __FILE__, size_tline = __LINE__);
Wraps a possibly-throwing expression in anothrow wrapper so that it can be called by anothrow function.
This wrapper function documents commitment on the part of the caller that the appropriate steps have been taken to avoid whatever conditions may trigger an exception during the evaluation ofexpr. If it turns out that the expressiondoes throw at runtime, the wrapper will throw anAssertError.
(Note thatThrowable objects such asAssertError that do not subclassException may be thrown even fromnothrow functions, since they are considered to be serious runtime problems that cannot be recovered from.)
Parameters:
TexprThe expression asserted not to throw.
stringmsgThe message to include in theAssertError if the assumption turns out to be false.
stringfileThe source file name of the caller.
size_tlineThe line number of the caller.
Returns:
The value ofexpr, if any.
Examples:
import std.math.algebraic : sqrt;// This function may throw.int squareRoot(int x){if (x < 0)thrownew Exception("Tried to take root of negative number");returncast(int) sqrt(cast(double) x);}// This function never throws.int computeLength(int x,int y)nothrow{// Since x*x + y*y is always positive, we can safely assume squareRoot// won't throw, and use it to implement this nothrow function. If it// does throw (e.g., if x*x + y*y overflows a 32-bit value), then the// program will terminate.returnassumeWontThrow(squareRoot(x*x + y*y));}writeln(computeLength(3, 4));// 5
pure nothrow @nogc @trusted booldoesPointTo(S, T, Tdummy = void)(auto ref const Ssource, ref const Ttarget)
if (__traits(isRef,source) || isDynamicArray!S || is(S == U*, U) || is(S == class));

pure nothrow @trusted booldoesPointTo(S, T)(auto ref const shared Ssource, ref const shared Ttarget);

pure nothrow @trusted boolmayPointTo(S, T, Tdummy = void)(auto ref const Ssource, ref const Ttarget)
if (__traits(isRef,source) || isDynamicArray!S || is(S == U*, U) || is(S == class));

pure nothrow @trusted boolmayPointTo(S, T)(auto ref const shared Ssource, ref const shared Ttarget);
Checks whether a given source object contains pointers or references to a giventarget object.
Parameters:
SsourceThe source object
TtargetThe target object
Bugs:
The function is explicitly annotated@nogc because inference could fail, seeBugzilla issue 17084.
Returns:
true ifsource's representation embeds a pointerthat points totarget's representation or somewhere insideit.
Ifsource is or contains a dynamic array, then, then these functions will checkif there is overlap between the dynamic array andtarget's representation.
Ifsource is a class, then it will be handled as a pointer.
Iftarget is a pointer, a dynamic array or a class, then these functions will onlycheck ifsource points totarget,not whattarget references.
Ifsource is or contains a union orvoid[n], then there may be either false positives orfalse negatives:
doesPointTo will returntrue if it is absolutely certainsource points totarget. It may produce false negatives, but neverfalse positives. This function should be prefered when trying to validateinput data.
mayPointTo will returnfalse if it is absolutely certainsource does not point totarget. It may produce false positives, but neverfalse negatives. This function should be prefered for defensively choosing acode path.

NoteEvaluatingdoesPointTo(x, x) checks whetherx hasinternal pointers. This should only be done as an assertive test,as the language is free to assume objects don't have internal pointers(TDPL 7.1.3.5).

Examples:
Pointers
int  i = 0;int* p =null;assert(!p.doesPointTo(i));p = &i;assert( p.doesPointTo(i));
Examples:
Structs and Unions
struct S{int v;int* p;}int i;auto s = S(0, &i);// structs and unions "own" their members// pointsTo will answer true if one of the members pointsTo.assert(!s.doesPointTo(s.v));//s.v is just v member of s, so not pointed.assert( s.p.doesPointTo(i));//i is pointed by s.p.assert( s  .doesPointTo(i));//which means i is pointed by s itself.// Unions will behave exactly the same. Points to will check each "member"// individually, even if they share the same memory
Examples:
Arrays (dynamic and static)
int i;// trick the compiler when initializing slice// https://issues.dlang.org/show_bug.cgi?id=18637int* p = &i;int[]  slice = [0, 1, 2, 3, 4];int[5] arr   = [0, 1, 2, 3, 4];int*[]  slicep = [p];int*[1] arrp   = [&i];// A slice points to all of its members:assert( slice.doesPointTo(slice[3]));assert(!slice[0 .. 2].doesPointTo(slice[3]));// Object 3 is outside of the// slice [0 .. 2]// Note that a slice will not take into account what its members point to.assert( slicep[0].doesPointTo(i));assert(!slicep   .doesPointTo(i));// static arrays are objects that own their members, just like structs:assert(!arr.doesPointTo(arr[0]));// arr[0] is just a member of arr, so not// pointed.assert( arrp[0].doesPointTo(i));// i is pointed by arrp[0].assert( arrp   .doesPointTo(i));// which means i is pointed by arrp// itself.// Notice the difference between static and dynamic arrays:assert(!arr  .doesPointTo(arr[0]));assert( arr[].doesPointTo(arr[0]));assert( arrp  .doesPointTo(i));assert(!arrp[].doesPointTo(i));
Examples:
Classes
class C{this(int* p){this.p = p;}int* p;}int i;C a =new C(&i);C b = a;// Classes are a bit particular, as they are treated like simple pointers// to a class payload.assert( a.p.doesPointTo(i));// a.p points to i.assert(!a  .doesPointTo(i));// Yet a itself does not point i.//To check the class payload itself, iterate on its members:(){import std.traits : Fields;foreach (index, _; Fields!C)if (doesPointTo(a.tupleof[index], i))return;assert(0);}();// To check if a class points a specific payload, a direct memmory check// can be done:auto aLoc =cast(ubyte[__traits(classInstanceSize, C)]*) a;assert(b.doesPointTo(*aLoc));// b points to where a is pointing
classErrnoException:object.Exception;
Thrown if errors that seterrno occur.
Examples:
import core.stdc.errno : EAGAIN;auto ex =newErrnoException("oh no", EAGAIN);writeln(ex.errno);// EAGAIN
Examples:
errno is used by default if no explicit error code is provided
import core.stdc.errno : errno, EAGAIN;auto old = errno;scope(exit) errno = old;// fake that errno got set by the calleeerrno = EAGAIN;auto ex =newErrnoException("oh no");writeln(ex.errno);// EAGAIN
final pure nothrow @nogc @property @safe uinterrno() scope;
Operating system error code.
final pure nothrow @nogc @property @safe stringerrnoMsg() scope;
Localized error message generated throughcore.stdc.string.strerror_r orcore.stdc.string.strerror.
@safe this(stringmsg, stringfile = null, size_tline = 0);
Constructor which takes an error message. The current globalcore.stdc.errno.errno value is used as error code.
@safe this(stringmsg, interrno, stringfile = null, size_tline = 0);
Constructor which takes an error message and error code.
CommonType!(T1, T2)ifThrown(E : Throwable = Exception, T1, T2)(lazy scope T1expression, lazy scope T2errorHandler);

CommonType!(T1, T2)ifThrown(E : Throwable, T1, T2)(lazy scope T1expression, scope T2 delegate(E)errorHandler);

CommonType!(T1, T2)ifThrown(T1, T2)(lazy scope T1expression, scope T2 delegate(Exception)errorHandler);
ML-style functional exception handling. Runs the supplied expression and returns its result. If the expression throws aThrowable, runs the supplied error handler instead and return its result. The error handler's type must be the same as the expression's type.
Parameters:
EThe type ofThrowables to catch. Defaults toException
T1The type of the expression.
T2The return type of the error handler.
T1expressionThe expression to run and return its result.
T2errorHandlerThe handler to run if the expression throwed.
Returns:
expression, if it does not throw. Otherwise, returns the result of errorHandler.
Examples:
Revert to a default value upon an error:
import std.conv : to;writeln("x".to!int.ifThrown(0));// 0
Examples:
Chain multiple calls to ifThrown, each capturing errors from theentire preceding expression.
import std.conv : ConvException, to;string s ="true";assert(s.to!int.ifThrown(cast(int) s.to!double)               .ifThrown(cast(int) s.to!bool) == 1);s ="2.0";assert(s.to!int.ifThrown(cast(int) s.to!double)               .ifThrown(cast(int) s.to!bool) == 2);// Respond differently to different types of errorsalias orFallback = (lazy a)  => a.ifThrown!ConvException("not a number")                                 .ifThrown!Exception("number too small");writeln(orFallback(enforce("x".to!int < 1).to!string));// "not a number"writeln(orFallback(enforce("2".to!int < 1).to!string));// "number too small"
Examples:
The expression and the errorHandler must have a common type they can bothbe implicitly casted to, and that type will be the type of the compoundexpression.
// null and new Object have a common type(Object).staticassert(is(typeof(null.ifThrown(new Object())) == Object));staticassert(is(typeof((new Object()).ifThrown(null)) == Object));// 1 and new Object do not have a common type.staticassert(!__traits(compiles, 1.ifThrown(new Object())));staticassert(!__traits(compiles, (new Object()).ifThrown(1)));
Examples:
Use a lambda to get the thrown object.
import std.format : format;writeln("%s".format.ifThrown!Exception(e =>typeid (e).name));// "std.format.FormatException"
enumRangePrimitive: int;
Thisenum is used to select the primitives of the range to handle by thehandle range wrapper. The values of theenum can beOR'd to select multiple primitives to be handled.
RangePrimitive.access is a shortcut for the access primitives;front,back andopIndex.
RangePrimitive.pop is a shortcut for the mutating primitives;popFront andpopBack.
Examples:
import std.algorithm.comparison : equal;import std.algorithm.iteration : map, splitter;import std.conv : to, ConvException;auto s ="12,1337z32,54,2,7,9,1z,6,8";// The next line composition will throw when iterated// as some elements of the input do not convert to integerauto r = s.splitter(',').map!(a => to!int(a));// Substitute 0 for cases of ConvExceptionauto h = r.handle!(ConvException,RangePrimitive.front, (e, r) => 0);assert(h.equal([12, 0, 54, 2, 7, 9, 0, 6, 8]));
Examples:
import std.algorithm.comparison : equal;import std.range : retro;import std.utf : UTFException;auto str ="hello\xFFworld";// 0xFF is an invalid UTF-8 code unitauto handled = str.handle!(UTFException,RangePrimitive.access,        (e, r) => ' ');// Replace invalid code points with spacesassert(handled.equal("hello world"));// `front` is handled,assert(handled.retro.equal("dlrow olleh"));// as well as `back`
front

back

popFront

popBack

empty

save

length

opDollar

opIndex

opSlice

access

pop
autohandle(E : Throwable, RangePrimitive primitivesToHandle, alias handler, Range)(Rangeinput)
if (isInputRange!Range);
Handle exceptions thrown from range primitives.
Use theRangePrimitive enum to specify which primitives to handle.Multiple range primitives can be handled at once by using theOR operatoror the pseudo-primitivesRangePrimitive.access andRangePrimitive.pop.All handled primitives must have return types or values compatible with theuser-supplied handler.
Parameters:
EThe type ofThrowable to handle.
primitivesToHandleSet of range primitives to handle.
handlerThe callable that is called when a handled primitive throws aThrowable of typeE. The handler must accept arguments of the formE, ref IRange and its return value is used as the primitive's return value wheneverE is thrown. ForopIndex, the handler can optionally recieve a third argument; the index that caused the exception.
RangeinputThe range to handle.
Returns:
A wrapperstruct that preserves the range interface ofinput.

NoteInfinite ranges with slicing support must return an instance ofstd.range.Take when sliced with a specific lower and upperbound (seestd.range.primitives.hasSlicing);handle deals withthis bytakeing 0 from the return value of the handler function andreturning that when an exception is caught.

Examples:
import std.algorithm.comparison : equal;import std.algorithm.iteration : map, splitter;import std.conv : to, ConvException;auto s ="12,1337z32,54,2,7,9,1z,6,8";// The next line composition will throw when iterated// as some elements of the input do not convert to integerauto r = s.splitter(',').map!(a => to!int(a));// Substitute 0 for cases of ConvExceptionauto h = r.handle!(ConvException, RangePrimitive.front, (e, r) => 0);assert(h.equal([12, 0, 54, 2, 7, 9, 0, 6, 8]));
Examples:
import std.algorithm.comparison : equal;import std.range : retro;import std.utf : UTFException;auto str ="hello\xFFworld";// 0xFF is an invalid UTF-8 code unitauto handled = str.handle!(UTFException, RangePrimitive.access,        (e, r) => ' ');// Replace invalid code points with spacesassert(handled.equal("hello world"));// `front` is handled,assert(handled.retro.equal("dlrow olleh"));// as well as `back`
templatebasicExceptionCtors()
Convenience mixin for trivially sub-classing exceptions
Even trivially sub-classing an exception involves writing boilerplate code for the constructor to: 1) correctly pass in the source file and line number the exception was thrown from; 2) be usable withenforce which expects exception constructors to take arguments in a fixed order. This mixin provides that boilerplate code.
Note however that you need to mark themixin line with at least a minimal (i.e. just///) DDoc comment if you want the mixed-in constructors to be documented in the newly created Exception subclass.
Current limitation: Due tobug #11500, currently the constructors specified in this mixin cannot be overloaded with any other custom constructors. Thus this mixin can currently only be used when no such custom constructors need to be explicitly specified.
Examples:
class MeaCulpa: Exception{///mixinbasicExceptionCtors;}trythrownew MeaCulpa("test");catch (MeaCulpa e){    writeln(e.msg);// "test"    writeln(e.file);// __FILE__    writeln(e.line);// __LINE__ - 5}
pure nothrow @nogc @safe this(stringmsg, stringfile = __FILE__, size_tline = __LINE__, Throwablenext = null);
Parameters:
stringmsgThe message for the exception.
stringfileThe file where the exception occurred.
size_tlineThe line number where the exception occurred.
ThrowablenextThe previous exception in the chain of exceptions, if any.
pure nothrow @nogc @safe this(stringmsg, Throwablenext, stringfile = __FILE__, size_tline = __LINE__);
Parameters:
stringmsgThe message for the exception.
ThrowablenextThe previous exception in the chain of exceptions.
stringfileThe file where the exception occurred.
size_tlineThe line number where the exception occurred.
Copyright © 1999-2026 by theD Language Foundation | Page generated byDdoc on Sat Feb 21 06:58:27 2026

[8]ページ先頭

©2009-2026 Movatter.jp