| # zx_task_create_exception_channel | |
| ## NAME | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| Create an exception channel for a given job, process, or thread. | |
| ## SYNOPSIS | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| ```c | |
| #include <zircon/syscalls.h> | |
| zx_status_t zx_task_create_exception_channel(zx_handle_t handle, | |
| uint32_t options, | |
| zx_handle_t* out); | |
| ``` | |
| ## DESCRIPTION | |
| `zx_task_create_exception_channel()` creates a channel which will receive | |
| exceptions from the thread, process, or job. | |
| *handle* is the thread, process, or job handle to receive exceptions from. | |
| *options* can be 0 or **ZX_EXCEPTION_CHANNEL_DEBUGGER** to register for debug | |
| exceptions (process or job only). | |
| *out* will be filled with the newly created channel endpoint on success. This | |
| channel will be read-only with the following rights: | |
| * **ZX_RIGHT_TRANSFER** | |
| * **ZX_RIGHT_WAIT** | |
| * **ZX_RIGHT_READ** | |
| ### Exception Messages | |
| When an exception occurs, the channel will receive a message containing one | |
| exception handle and one `zx_exception_info_t` data. | |
| The thread will remain blocked in the exception until the received exception | |
| handle is closed, at which point it will either resume or exception processing | |
| will continue according to the chosen behavior (see **ZX_PROP_EXCEPTION_STATE** | |
| in [`zx_object_get_property()`]). | |
| ### Unbinding | |
| Closing the created channel handle will unregister the exception handler. If | |
| an exception message is waiting in the channel at the time it's closed, exception | |
| handling will continue on to the next handler in the search order. | |
| ## RIGHTS | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| *handle* must have **ZX_RIGHT_INSPECT** and have **ZX_RIGHT_DUPLICATE** and have **ZX_RIGHT_TRANSFER** and have **ZX_RIGHT_MANAGE_THREAD**. | |
| If *handle* is of type **ZX_OBJ_TYPE_JOB** or **ZX_OBJ_TYPE_PROCESS**, it must have **ZX_RIGHT_ENUMERATE**. | |
| ## RETURN VALUE | |
| `zx_task_create_exception_channel()` returns **ZX_OK** on success. | |
| In the event of failure, a negative error value is returned. | |
| ## ERRORS | |
| **ZX_ERR_ACCESS_DENIED** The caller has a job policy in place preventing the | |
| creation of new channels. | |
| **ZX_ERR_ALREADY_BOUND** *handle* is already bound to an exception channel. | |
| **ZX_ERR_BAD_HANDLE** *handle* is not a valid handle. | |
| **ZX_ERR_BAD_STATE** *handle* is dying or dead. | |
| **ZX_ERR_INVALID_ARGS** A bad value has been passed in *options*. | |
| **ZX_ERR_NO_MEMORY** Failure due to lack of memory. | |
| There is no good way for userspace to handle this (unlikely) error. | |
| In a future build this error will no longer occur. | |
| **ZX_ERR_WRONG_TYPE** *handle* is not that of a job, process, or thread. | |
| ## SEE ALSO | |
| - [exceptions](/docs/concepts/kernel/exceptions.md) | |
| - [`zx_channel_read()`] | |
| <!-- References updated by update-docs-from-fidl, do not edit. --> | |
| [`zx_channel_read()`]: channel_read.md | |
| [`zx_object_get_property()`]: object_get_property.md |